рдпрд╣ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдХреАрд╡реА, рдЬрд╝реИрдорд░реАрди рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореВрд▓ред рдЗрд╕рдореЗрдВ, рдореИрдВ рдЙрд╕реА рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди Xamarin.Forms рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред
рдореИрдВ рдЯреАрдХреЗ рдХреЛ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛; рдЗрд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдХрд┐рд╡реАред Xamarinред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдореВрд▓рдирд┐рд╡рд╛рд╕реАред рддреАрди рдЪреМрдЦрдЯреЗ - рдПрдХ рдкреНрд░рдпреЛрдЧрддреАрд╕рд░рд╛ рднрд╛рдЧ
рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдиреЗрдЯрд┐рд╡:
рдХрд┐рд╡реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ
ред Xamarinред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдореВрд▓рдирд┐рд╡рд╛рд╕реАред рддреАрди рд░реВрдкрд░реЗрдЦрд╛рдПрдБ - рдПрдХ рдкреНрд░рдпреЛрдЧ (рднрд╛рдЧ 3)рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ Xamarin.Forms рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛ рдФрд░ рдореИрдВ рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред Xamarin.Forms Xamarin.iOs рдФрд░ Xamarin.Android рдХреЗ рд▓рд┐рдП рдПрдХ рдРрдб-рдСрди рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдмрд╛рдж, рд╕рд╛рдорд╛рдиреНрдп рджреЗрд╢реА рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП "рддреИрдирд╛рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЖрдкрдХреЛ рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЗрд╢реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВред
Xamarin.Forms рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ WPF рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧ .NET рдорд╛рдирдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп MVVM рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА .NET рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА NuGet рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ Xamarin.For рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
рддреЛ, рдЪрд▓реЛ рдПрдХ рдЦрд╛рд▓реА Xamarin.Forms рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдиреЛрдЯ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд░реНрдЧ рд╣реЛрдВрдЧреЗ:
public class Note { public string UserIconPath { get; set; } public string UserName { get; set; } public DateTime EditTime { get; set; } public string Text { get; set; } } public class Project { public string Name { get; set; } public ObservableCollection<Note> Notes { get; set; } public Project() { Notes = new ObservableCollection<Note>(); } }
рдореИрдВ MVVM рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рднреА рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рджреГрд╢реНрдп рдореЙрдбрд▓ INotifyPropertyChanged рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдкрд╣рд▓реА рд╕реНрдХреНрд░реАрди рд╣реЛрдЧреА, рдЙрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдпрд╛ рд╡рд░реНрддрдорд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреАред рдЪрд▓реЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:
public class MainViewModel { public ObservableCollection<Project> Projects { get; set; } public MainViewModel() { Projects = Project.GetTestProjects(); } public void AddNewProject(string name) { Project project = new Project() { Name = name }; Projects.Add(project); } public void DeleteProject(Project project) { Projects.Remove(project); } }
рд╕реНрдХреНрд░реАрди рдХреЛрдб рд╣реА:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:TodoList.View" x:Class="TodoList.View.ProjectsPage"> <ContentPage.ToolbarItems> <ToolbarItem Clicked="AddNew_Clicked" Icon="plus.png"/> </ContentPage.ToolbarItems> <ListView ItemsSource="{Binding Projects}" ItemTapped="List_ItemTapped"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding Name}" TextColor="Black"> <TextCell.ContextActions> <MenuItem Clicked="DeleteItem_Clicked" IsDestructive="true" CommandParameter="{Binding .}" Text="Delete"/> </TextCell.ContextActions> </TextCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentPage>
рдорд╛рд░реНрдХрдЕрдк рдХрд╛рдлреА рд╕рд░рд▓ рдирд┐рдХрд▓рд╛, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдмрдЯрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред ListView рдореЗрдВ ContextActions рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ iOS рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЬрд╝реЛрд░ рд╕реЗ рдорд╛рд░рдирд╛ рд╣реЛрдЧрд╛, Android рдореЗрдВ - рдПрдХ рд▓рдВрдмреЗ рдЯреИрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг Xamarin.Forms рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо Android рдореЗрдВ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдореВрд▓ рднрд╛рдЧ рдореЗрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдерд╛ :) рдирддреАрдЬрддрди, рдЖрдИрдУрдПрд╕ рдореЗрдВ рд╕реНрд╡рд╛рдЗрдк рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
<TextCell.ContextActions> <MenuItem Clicked="DeleteItem_Clicked" IsDestructive="true" CommandParameter="{Binding .}" Text="Delete"/> </TextCell.ContextActions>
рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдирд┐рдореНрди рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ:

рдЕрдм рдЖрдЗрдП рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ:
MainViewModel ViewModel { get { return BindingContext as MainViewModel; } } async Task DeleteItem_Clicked(object sender, EventArgs e) { MenuItem menuItem = sender as MenuItem; if (menuItem == null) return; Project project = menuItem.CommandParameter as Project; if (project == null) return; bool answer = await DisplayAlert("Are you sure?", string.Format("Would you like to remove the {0} project", project.Name), "Yes", "No"); if(answer) ViewModel.DeleteProject(project); }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреВрдЫреЗ рдмрд┐рдирд╛ рдХреБрдЫ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ Xamarin.Forms рдореЗрдВ рдорд╛рдирдХ DisplayAlert рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрди рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдпрд╣ рд╡рд┐рдВрдбреЛ iOs рдХреА рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдВрдбреЛ рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ред
рдЕрдЧрд▓рд╛ рд╣рдо рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Xamarin.Forms рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдП рдЧрдП рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рдорд╛рди рд╕рдВрд╡рд╛рдж рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкрд╛рда рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрд╛рдп рд╣реИрдВ:
- рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реЗрд╡рд╛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдореВрд▓ рд╕рдВрд╡рд╛рдж рдмрдврд╝рд╛рдПрдЧреА;
- Xamarin.Forms рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдореИрдВ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдореИрдВрдиреЗ рдзрд╛рдЧреЗ рд╕реЗ рд▓рд┐рдпрд╛ рдерд╛:
рдПрдХ рд╕рд░рд▓ рдЗрдирдкреБрдЯрдмреЙрдХреНрд╕ рд╕рдВрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реЗрдВ? , рдЕрд░реНрдерд╛рддреН рдЯрд╛рд╕реНрдХ рдЗрдирдкреБрдЯрдмреЙрдХреНрд╕ (рдЗрдирд╡реАрдЧреЗрд╢рди рдиреЗрд╡рд┐рдЧреЗрд╢рди) рд╡рд┐рдзрд┐ред
async Task AddNew_Clicked(object sender, EventArgs e) { string result = await InputBox(this.Navigation); if (result == null) return; ViewModel.AddNewProject(result); }
рдЕрдм рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЯреИрдк рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗ:
void List_ItemTapped(object sender, Xamarin.Forms.ItemTappedEventArgs e) { Project project = e.Item as Project; if (project == null) return; this.Navigation.PushAsync(new NotesPage() { BindingContext = new ProjectViewModel(project) }); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╡реНрдпреВ рдореЙрдбрд▓ рдФрд░ рд╡рд┐рдВрдбреЛ рдХреЗ рдкреЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдореЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЗрд╕реЗ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕ рдкреИрдирд▓ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, App.xaml.cs рдореЗрдВ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
NavigationPage navigation = new NavigationPage(); navigation.PushAsync(new View.ProjectsPage() { BindingContext = new MainViewModel() }); MainPage = navigation;
рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕рдкреЗрдЬ рдмрд┐рд▓реНрдХреБрд▓ рдЦрд┐рдбрд╝рдХреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЕрдм рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдиреЛрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдЦрд┐рдбрд╝рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦрд┐рдбрд╝рдХреА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рдХрд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:
рдиреЛрдЯреНрд╕ рджреЗрдЦреЗрдВ <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TodoList.View.NotesPage" xmlns:local="clr-namespace:TodoList.View" xmlns:utils="clr-namespace:TodoList.Utils" Title="{Binding Project.Name}"> <ContentPage.Resources> <ResourceDictionary> <utils:PathToImageConverter x:Key="PathToImageConverter"/> </ResourceDictionary> </ContentPage.Resources> <ContentPage.ToolbarItems> <ToolbarItem Clicked="AddNew_Clicked" Icon="plus.png"/> </ContentPage.ToolbarItems> <ListView ItemsSource="{Binding Project.Notes}" x:Name="list" ItemTapped="List_ItemTapped" HasUnevenRows="True"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <local:MyCellGrid Margin="5"> <local:MyCellGrid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition Height="*"/> </local:MyCellGrid.RowDefinitions> <local:MyCellGrid.ColumnDefinitions> <ColumnDefinition Width="40"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="40"/> </local:MyCellGrid.ColumnDefinitions> <Image Grid.Row="0" Grid.Column="0" Source="{Binding UserIconPath, Converter={StaticResource PathToImageConverter}}" /> <StackLayout Grid.Row="0" Grid.Column="1"> <Label Text="{Binding UserName}" FontAttributes="Bold"/> <Label Text="{Binding EditTime}"/> </StackLayout> <Button Grid.Row="0" Grid.Column="2" BackgroundColor="Transparent" Image="menu.png" Margin="5" HorizontalOptions="FillAndExpand" Clicked="RowMenu_Clicked"/> <local:MyLabel Grid.Row="1" Grid.Column="1" Margin="0,10,0,0" Grid.ColumnSpan="2" Text="{Binding Text}"/> </local:MyCellGrid> <ViewCell.ContextActions> <MenuItem Clicked="DeleteItem_Clicked" IsDestructive="true" CommandParameter="{Binding .}" Text="Delete"/> </ViewCell.ContextActions> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentPage>
рд╡рд┐рдВрдбреЛ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕реВрдЪреА рджреГрд╢реНрдп рд╣реИ, рдЬреЛ рдиреЛрдЯреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдКрдБрдЪрд╛рдИ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 150 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ HasUnevenRows = "True" рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ ListView рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЙрддрдиреА рдЬрдЧрд╣ рд▓реЗ рд╕рдХреЗ, рдЬрд┐рддрдирд╛ рд╡реЗ рдкреВрдЫрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрдВрдХреНрддрд┐рдпрд╛рдБ 150 рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдКрдБрдЪрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рд╕реВрдЪреА рджреГрд╢реНрдп рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕реЗрд▓ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд╛рд░рд┐рд╕ рдХреЛ рдЧреНрд░рд┐рдб рдкреИрдирд▓: MyCellGrid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдорд╛рдк рдСрдкрд░реЗрд╢рди рдкрд░ рдпрд╣ рдкреИрдирд▓ рдЖрдВрддрд░рд┐рдХ рддрддреНрд╡реЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 150 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ:
public class MyCellGrid : Grid { protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint) { SizeRequest sizeRequest = base.OnMeasure(widthConstraint, heightConstraint); if (sizeRequest.Request.Height <= 150) return sizeRequest; return new SizeRequest(new Size() { Width = sizeRequest.Request.Width, Height = 150 }); } }
рдЪреВрдВрдХрд┐ рдЯреАрдУрдЖрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдореЗрдВ рдЯреИрдк рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдбрд┐рдЯ рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рд▓рд╛рдЗрди рдХреЗ рдХреЛрдиреЗ рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦреБрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдореЗрдиреВ рднреА, рд╣рдо рдЗрд╕ рдмрдЯрди рдХреЛ рд╕реЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдЙрд╕ рдкрд░ рдЯреИрдк рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╢рд╛рд░реЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рд▓рд╛рдЗрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
<Button Grid.Row="0" Grid.Column="2" BackgroundColor="Transparent" Image="menu.png" Margin="5" HorizontalOptions="FillAndExpand" Clicked="RowMenu_Clicked"/>
рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдлреЙрд░реНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЗрд╕ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрд╕реА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реВрдЪреА рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рд▓рд╛рдЗрди рдХреЗ рдХреЛрдиреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдкрд░ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ Xamarin рдкрд░ рдХрд░реВрдВрдЧрд╛ред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗред
рджрд░рдЕрд╕рд▓, рд╣рдореЗрдВ рдмрд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:
<StackLayout> <Button Text=тАЭEditтАЭ/> <Button Text=тАЭDeleteтАЭ/> </StackLayout>
рдФрд░ рдЗрд╕реЗ рдмрдЯрди рдХреЗ рдмрдЧрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдПрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдпрд╣ "рдмрдЯрди рдХреЗ рдмрдЧрд▓ рдореЗрдВ" рдХрд╣рд╛рдБ рд╣реИред рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╕реВрдЪреА рджреГрд╢реНрдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░, рдЬрдм рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдмрдЯрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗрд╡рд▓ рд╕реВрдЪреА рдореЗрдВ рд╕реНрдерд┐рдд рдЖрдВрддрд░рд┐рдХ рд╕реНрдХреНрд░реЙрд▓ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдХрд┐рддрдирд╛ рд╕реНрдХреНрд░реЙрд▓ рд╣реБрдЖред ListView рд╣рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдорд╛рди рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЕрдзрд┐рдХ рдорд╛рдирдХ рдФрд░ рд╕рд░рд▓ рдПрдХ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛: рдорд╛рдирдХ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджрд░реНрдн рдореЗрдиреВ рджрд┐рдЦрд╛рдПрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрдЯрди рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛:
async Task RowMenu_Clicked(object sender, System.EventArgs e) { string action = await DisplayActionSheet("Note action:", "Cancel", null, "Edit", "Delete"); if (action == null) return; BindableObject bindableSender = sender as BindableObject; if(bindableSender != null) { Note note = bindableSender.BindingContext as Note; if (action == "Edit") { EditNote(note); } else if(action == "Delete") { await DeleteNote(note); } } }
DisplayActionSheet рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдирд┐рдпрдорд┐рдд рд╕рдВрджрд░реНрдн рдореЗрдиреВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рджреЗрдВ, рддреЛ рдиреЛрдЯ рдХрд╛ рдкрд╛рда рдореЗрд░реЗ MyLabel рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдорд┐рдд рд▓реЗрдмрд▓ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЛрдЯ рдХреЗ рдкрд╛рда рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирдпрд╛ рдкрд╛рда рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрдмрд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, Xamarin.Forms рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реЗрд▓ рдЖрдХрд╛рд░ рдХреЛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред Xamarin рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рд╣рд╛рдВ, рдФрд░ ListView рдХреЗ рдкрд╛рд╕ рдЦреБрдж рдХреЛрдИ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдП, InvalidateLayout рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд╣реИ рд╕реЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ ForceUpdateSize рддрд░реАрдХрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╣реА рд╕рдордп рдкрд░ рд╣рд╛рдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд▓реЗрдмрд▓ рд╡рд╛рд░рд┐рд╕ рд▓рд┐рдЦрд╛ рдФрд░ рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╣рд░ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдЦреАрдВрдЪрддрд╛ рд╣реВрдВ:
public class MyLabel : Label { protected override void OnPropertyChanged([CallerMemberName] string propertyName = null) { base.OnPropertyChanged(propertyName); if (propertyName == "Text") { ((this.Parent as MyCellGrid).Parent as Cell).ForceUpdateSize(); } } }
рдПрдХ рдиреЛрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, ListView рдирдП рдкрд╛рда рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред
рдирдпрд╛ рдиреЛрдЯ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рдпрд╛ рдмрдирд╛рддреЗ рд╕рдордп, рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕рдВрдкрд╛рджрдХ рдФрд░ рдЯреВрд▓рдмрд╛рд░ рдкрд░ рд╕реЗрд╡ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдВрдбреЛ рдЦреБрд▓рддреА рд╣реИ:

рдпрд╣ рд╡рд┐рдВрдбреЛ рдЯреАрдХреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╕реЗ рд╣реИ: рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдПрдХ рдЧреЛрд▓ рдмрдЯрди рдХреА рдХрдореА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдмрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреАрдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдореБрдЭреЗ рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдореВрд▓ рдореЗрдВ рди рдЬрд╛рдПрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рд╢реАрд░реНрд╖ рдкреИрдирд▓ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╣реЗрдЬреЗрдВ рдмрдЯрди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдпрд╣ рд╡рд┐рдВрдбреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
Xamarin.Forms рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ рдЬреЛ .NET рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдирдП рдЖрдИрдбреАрдИ рдФрд░ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХрд┐рд╕реА рдЕрдиреНрдп XAML рдЖрдзрд╛рд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЛрдб рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╝рд╛рдорд░реАрди рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЖрд╡реЗрджрди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдореИрдХрдУрдПрд╕ рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
Xamarin.Forms рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд▓рд╛рд▓-рдЖрдВрдЦреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦреЗрдВред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ Microsoft рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, Xamarin рдореБрдлрд╝реНрдд рд╣реИ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдореБрдлреНрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ Xamarin.Forms рд╣реБрдб рдХреЗ рддрд╣рдд .NET рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред
Xamarin.Forms рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореВрд▓ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рдорд╛рди C # рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди API рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рдереАрдВред
рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ, рдмрд▓реНрдХрд┐ рдЕрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рд╕рддрд░реНрдХ рд╕рдВрджреЗрд╢ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╛рдд Xamarin.Forms рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд╛рдирдХ рдореЗрдиреВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╛рда рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдХреЗрд╡рд▓ iOS рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП Xamarin.Forms рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред
рдШрдЯрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдЕрд╕рдВрднрд╡ рд╣реИред рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдиреЛрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣реА рд╕реНрд╡рд╛рдЗрдк рдХреЗрд╡рд▓ iOS рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, рдпрд╣ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрд░рд╡рд╛рдИ рдПрдХ рдореЗрдиреВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рдПрдЧреА рдЬреЛ рдПрдХ рд▓рдВрдмреЗ рдЯреИрдк рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдВрдбреНрд░реЙрдЗрдб рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦреЗрдВред
рдФрд░ рд╣рд╛рдВ, рдкреНрд░рджрд░реНрд╢рдиред Xamarin.Forms рдкрд░ рдЖрд╡реЗрджрди рдХреА рдЧрддрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓ рдЖрд╡реЗрджрди рдХреА рдЧрддрд┐ рд╕реЗ рдХрдо рд╣реЛрдЧреАред рддреЛ Microsoft рд╕реНрд╡рдпрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд╛рдордЭрд╛рдо рдХреЗ рдПрдХ рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ Xamarin.Forms рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рдпрд╛ рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореВрд▓ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд╝рд╛рдорд░реАрди рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдореВрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░реВрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред