Итак, у меня есть этот код, который мне нужно повторно использовать более или менее на всех моих страницах, но я немного устал менять одну страницу и делать то же самое в 10 или более местах. Есть ли лучший способ сделай это?
Использование Xamarin.Forms. Может быть, это можно сделать с помощью настраиваемого контроллера или каким-либо другим способом с расширением разметки, чтобы внутри stacklayout сделать ссылку x: static на него?
<!--#region BOTTOM Navigation Bar-->
<!-- Theme Colored bar-->
<StackLayout Grid.Row = "3" Grid.Column = "0" Grid.ColumnSpan = "3" Padding = "0,0,0,0" Spacing = "0" VerticalOptions = "FillAndExpand" HorizontalOptions = "FillAndExpand" Orientation = "Horizontal" BackgroundColor = "{StaticResource ThemeBkColor}" >
</StackLayout>
<!-- Bottom Menu bar -->
<StackLayout Grid.Row = "3" Grid.Column = "0" Grid.ColumnSpan = "3" Padding = "0,3,0,3" Spacing = "0" VerticalOptions = "FillAndExpand" HorizontalOptions = "FillAndExpand" Orientation = "Horizontal" BackgroundColor = "{StaticResource ThemeBkColorBottomBar}" >
<!-- Left -->
<StackLayout Padding = "15,0,0,0" Spacing = "10" VerticalOptions = "FillAndExpand" HorizontalOptions = "StartAndExpand" Orientation = "Horizontal" >
<StackLayout Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "CenterAndExpand" Spacing = "2">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToCheckUpdates}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "updates.png" HeightRequest = "35" WidthRequest = "35" HorizontalOptions = "Center" />
<Label Text = "Updates" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
</StackLayout>
<!-- Center -->
<StackLayout Padding = "0,0,0,0" Orientation = "Horizontal" Spacing = "0" VerticalOptions = "FillAndExpand" HorizontalOptions = "FillAndExpand" >
<Grid HorizontalOptions = "FillAndExpand" VerticalOptions = "FillAndExpand" Padding = "0,0,0,0" RowSpacing = "0" ColumnSpacing = "0">
<Grid.RowDefinitions>
<RowDefinition Height = "*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Row = "0" Grid.Column = "0" Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "FillAndExpand" Spacing = "2" >
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToCatalog}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "catalogues.png" HeightRequest = "35" WidthRequest = "35" HorizontalOptions = "Center">
</Image>
<Label Text = "Catalog" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
<StackLayout Grid.Row = "0" Grid.Column = "1" Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "FillAndExpand" Spacing = "2">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToPresentation}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "display.png" HeightRequest = "35" WidthRequest = "35" HorizontalOptions = "Center" >
</Image>
<Label Text = "Presentations" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
<StackLayout Grid.Row = "0" Grid.Column = "2" Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "FillAndExpand" Spacing = "2">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToScan}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "scan.png" HeightRequest = "35" WidthRequest = "35" HorizontalOptions = "Center">
</Image>
<Label Text = "Scanner" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
<StackLayout Grid.Row = "0" Grid.Column = "3" Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "FillAndExpand" Spacing = "2">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToSearch}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "Search.png" HeightRequest = "35" WidthRequest = "35" HorizontalOptions = "Center">
</Image>
<Label Text = "Search" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
</Grid>
</StackLayout>
<!-- Right -->
<StackLayout Padding = "0,0,15,0" Spacing = "10" VerticalOptions = "FillAndExpand" HorizontalOptions = "EndAndExpand" Orientation = "Horizontal" >
<StackLayout Orientation = "Vertical" VerticalOptions = "Center" HorizontalOptions = "CenterAndExpand" Spacing = "2">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding CmdGoToLoginLogout}" NumberOfTapsRequired = "1"/>
</StackLayout.GestureRecognizers>
<Image Source = "logout.png" HeightRequest = "35" WidthRequest = "35" >
</Image>
<Label Text = "Settings" HorizontalOptions = "Center" Style = "{StaticResource BottomMenuBtnText}" />
</StackLayout>
</StackLayout>
</StackLayout>
<!--#endregion-->
Сладкий! Это именно то, что я ищу, если бы я хотел, например, не включать одну из «кнопок изображения» стека, как бы я это сделал? Например, в представлении входа в систему или, может быть, вместо клиента, использующего приложение, это администратор, у которого должна быть дополнительная кнопка, видимая только ему?
Вы можете добавить связываемое свойство, который показывает и скрывает кнопку или даже добавляет или удаляет представления для вашего элемента управления.





Вы можете создать CustomView, а затем включить его в свои страницы.
Для этого вы создаете YourCustomView.xaml,
<ContentView xmlns = "http://xamarin.com/schemas/2014/forms"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "YourProject.YourCustomView">
</ContentView>
И в свой Page.xaml вы включаете его
<ContentPage xmlns = "http://xamarin.com/schemas/2014/forms"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views = "clr-namespace:YourProject;assembly=YourProject"
x:Class = "YourProject.YourPage">
<views:YourCustomView/>
</ContentPage>
Следующим шагом является привязка необходимых вам свойств, для этого вам необходимо создать BindableProperties в вашем CustomView. Вы можете повторно использовать это на всех страницах, которые захотите.
Это не повторное использование, оно по своей сути создает новые объекты пользовательского интерфейса для каждой страницы, использующей его. Будет очень медленно
Вы можете создать свой собственный пользовательский элемент управления для этих представлений и просто использовать его на своих страницах. Вот неплохой пример