Как загрузить две динамические страницы в главное окно

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

У меня есть мое главное окно с рамкой внутри сетки.
Я хочу загрузить страницу 1 внутри фрейма. Теперь у меня есть кнопка на этой Странице1. Эта кнопка должна закрыть страницу 1 и загрузить страницу 2 во фрейме. На второй странице также есть кнопка. С помощью кнопки на странице 2 я хочу загрузить страницу 1. И так далее. Если бы я разместил две кнопки в главном окне, я мог бы загрузить обе страницы, но мне нужны кнопки отдельно на каждой странице.

 namespace PageTest
{

    public partial class MainWindow : Window

    {
        public MainWindow()
        {
            InitializeComponent();
            FrameContent.Content = new Page1();
        }
    }
}


namespace PageTest
{

    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();     
        }

        private void BtnLoadPage2_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}


namespace PageTest
{

    public partial class Page2 : Page
    {
        public Page2()
        {
            InitializeComponent();
        }

        private void BtnLoadPage1_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}
 

Комментарии:

1. Добро пожаловать в StackOverflow! Вы пытались сделать свое главное окно статичным? Или сделать как a public static MainWindow mw = this; ? Благодаря этому вы можете получить доступ к фрейму отовсюду

Ответ №1:

Вы могли бы использовать тот факт, что нажатие кнопки является маршрутизируемым событием, чтобы обработать его в родительском фрейме.

     <Frame Name="ParentFrame"
           Button.Click="ParentFrame_Click"
           >
    </Frame>
 

Код

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        ParentFrame.Navigate(new Page1());
    }

    private void ParentFrame_Click(object sender, RoutedEventArgs e)
    {
        Button btn = e.OriginalSource as Button;
        if(btn == null || btn.Tag == null)
        {
            return;
        }
        Page page = (Page)Activator.CreateInstance((Type)btn.Tag);
        ParentFrame.Navigate(page);
    }
}
 

Кнопка на странице 1:

     <Button Width="100" Height="30"
            Content="Go Page 2"
            Tag="{x:Type local:Page2}"
            />
 

Страница 2:

     <Button Width="100" Height="30"
            Content="Go Page 1"
            Tag="{x:Type local:Page1}"
            />
 

Однако. Это было бы сочтено неподходящим для коммерческого приложения во всех командах, в которых я работал. Гораздо более привычно использовать MVVM и viewmodel для первой навигации с usercontrols, представленными contentcontrols.

Ответ №2:

Вы можете поместить код для обмена страницами в MainWindow.cs, тогда вам нужно будет определить события на обеих страницах, например; PageSwapRequested . Вы будете регистрироваться на это событие каждый раз, когда создается страница, и при нажатии кнопки это вызовет событие.

Что-то вроде этого,

     namespace PageTest
    {

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                var page1 = new Page1();
                page1.PageSwapRequested  = Page1_PageSwapRequested;
                FrameContent.Content = page1;
            }

            private void Page1_PageSwapRequested(object sender, EventArgs e)
            {
                //TODO: swap pages and don't forget to remove Page1_PageSwapRequested event handler.
                //page1.PageSwapRequested -= Page1_PageSwapRequested;
            }
        }
    }

    namespace PageTest
    {

        public partial class Page1 : Page
        {
            public event EventHandler PageSwapRequested;
            private void OnPageSwapRequested()
            {
                this.PageSwapRequested?.Invoke(this, EventArgs.Empty);
            }
            public Page1()
            {
                InitializeComponent();
            }

            private void BtnLoadPage2_Click(object sender, RoutedEventArgs e)
            {
                OnPageSwapRequested();
            }
        }
    }

    namespace PageTest
    {

        public partial class Page2 : Page
        {
            public event EventHandler PageSwapRequested;
            private void OnPageSwapRequested()
            {
                this.PageSwapRequested?.Invoke(this, EventArgs.Empty);
            }
            public Page2()
            {
                InitializeComponent();
            }

            private void BtnLoadPage1_Click(object sender, RoutedEventArgs e)
            {
                this.OnPageSwapRequested();
            }
        }
    }
 

Комментарии:

1. Спасибо вам за все ваши ответы. Это было очень полезно. Все методы отлично работают, но этот был лучшим для моего проекта. Извините за мой плохой английский и привет из Германии.