Как загрузить две страницы динамически в MainWindow - PullRequest
0 голосов
/ 16 апреля 2019

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

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)
        {

        }
    }
}

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

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

    <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}"
            />

Page2:

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

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

0 голосов
/ 16 апреля 2019

Вы можете поместить код для замены страниц на 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();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...