#c# #android #xamarin #xamarin.forms #navigation
Вопрос:
Я работаю над навигацией своего приложения. Мне нужно полностью контролировать навигацию, позволять пользователю возвращаться только тогда, когда я хочу, чтобы он это делал, контролировать, на какую страницу он возвращается, может быть, на последнюю страницу или, может быть, в главное меню или на другую страницу между ними. Для меня самый простой способ контролировать это-использовать эти действия:
Navigation.InsertPageBefore(new NotAccesableGoBackPage(), this);
Navigation.PopAsync(false);
Navigation.PushAsync(new AccesableGoBackPage());
App.Current.MainPage = new NavigationPage(new DestroyNavigationStack());
Объединив их, я получаю полный контроль над своей навигацией. Теперь моя проблема. Я хочу, чтобы у меня всегда был общий доступ к верхнему колонтитулу, кнопкам управления и нижнему колонтитулу между моими страницами. Я прочитал и обнаружил, что мне нужно использовать contentView для шаблона и страницу содержимого для тела. Но с помощью contentsView я не могу использовать навигацию, которую я использую.
Как я мог бы решить эту проблему? Какие-нибудь рекомендации? Спасибо.
Редактировать:
Это мой шаблон. В нем есть верхний, нижний и нижний колонтитулы:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:dxe="http://schemas.devexpress.com/xamarin/2014/forms/editors"
x:Class="NoguianaNucleo.Views.ContainerPage"
NavigationPage.HasNavigationBar="false">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!--Header -->
<RowDefinition Height="2*"/>
<!--Body -->
<RowDefinition Height="24*"/>
<!--Buttons -->
<RowDefinition Height="3*"/>
<!--Footer -->
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<!--Header -->
<Label x:Name="lbl_title" x:FieldModifier="public" Grid.Row="0"/>
<!--Body -->
<Grid x:Name="body_grid" Grid.Row="1" x:FieldModifier="public"/>
<!--Buttons -->
<Grid Grid.Row="2" BackgroundColor="#C8A2C8">
<Grid.ColumnDefinitions>
<!--B1 -->
<ColumnDefinition/>
<!--B2 -->
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<!--B1 -->
<dxe:SimpleButton x:Name="btn_1" x:FieldModifier="public" Grid.Row="0" Grid.Column="0"/>
<!--B2 -->
<dxe:SimpleButton x:Name="btn_2" x:FieldModifier="public" Grid.Row="0" Grid.Column="1"/>
</Grid>
<!--Footer -->
<Label x:Name="lbl_footer" x:FieldModifier="public" Grid.Row="3"/>
</Grid>
</ContentPage>
Это мой элемент управления C# для шаблона:
public partial class ContainerPage : ContentPage {
public ContainerPage() {
InitializeComponent();
lbl_footer.Text = "Footer";
}
}
Это содержимое моего тела (XAML):
<?xml version="1.0" encoding="utf-8" ?>
<views:ContainerPage xmlns:views="clr-namespace:NoguianaNucleo.Views"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="NoguianaNucleo.Views.Gestion.ConsultationEmplacementPage">
</views:ContainerPage>
Y C# тела:
public ConsultationEmplacementPage() {
InitializeComponent();
//Title
lbl_title.Text = "Lorem ipsu...";
//Text
Label info = new Label();
info.Text = "Lorem ipsu...";
body_grid.Children.Add(info, 0, 0);
body_grid.Children.Add(barcode, 0, 1);
btn_2.Icon = "Back.png";
btn_2.Clicked = (sender, e) => {
btn_4.IconColor = Utilities.black;
Navigation.PopAsync();
};
}
Как я мог сделать этот последний код на XAML и вставить в body_grid
шаблон?
Комментарии:
1. создайте базовую страницу, содержащую представление верхнего и нижнего колонтитулов, а затем каждая из ваших страниц содержимого может наследовать эту базовую страницу
2. У меня уже есть такая конфигурация. Это работает нормально, но я должен дополнить тело программируемостью на C#, а не XAML. Использование C# для интерфейса — сложная работа. Есть еще какие-нибудь идеи?
3. Все, что я предложил, можно было бы сделать на c#. XAML не является обязательным требованием
4. Как я мог бы закодировать тело XAML от детей? Я собираюсь добавить свой код в сообщение
5. @Jason — Наследование от базовой страницы — как вы вводите содержимое конкретной страницы между верхним и нижним колонтитулами базовой страницы? Нужна более подробная информация об этом подходе. Несмотря на это, я добавил ссылку на рекомендуемое решение, которое заключается в использовании шаблона управления и центра представления содержимого. Предположительно, подход к базовой странице также использует ContentPresenter или аналогичный подэлемент.