如何在MainWindow中动态加载两个页面

时间:2019-04-16 13:16:13

标签: c# wpf xaml

我的MainWindow的网格内有一个框架。
我想在框架内加载Page1。现在,我在此Page1上有一个按钮。此按钮应关闭第1页并将第2页加载到框架中。第二页也有一个按钮。使用Page2上的按钮,我要加载Page1。等等。如果将两个按钮放在主窗口中,则可以加载两个页面,但是我需要在每个页面上分别放置按钮。

from .views import (
    BlogListView,
    BlogDetailView,
    BlogCreateView,
    BlogUpdateView,
    BlogDeleteView,
)

urlpatterns = [
    path('post/<int:pk>/delete/',
         BlogDeleteView.as_view(), name='post_delete'),
    path('post/<int:pk>/edit',
         BlogUpdateView.as_view(), name='post_edit'),
    path('post/new/', BlogCreateView.as_view(), name='post_new'),
    path('post/<int:pk>/', BlogDetailView.as_view(), name='post_detail'),
    path('', BlogListView.as_view(), name='home'),
]

2 个答案:

答案 0 :(得分: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);
    }
}

Page1中的按钮:

    <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优先导航与contentcontrols所提供的用户控件一起使用。

答案 1 :(得分:0)

您可以将代码放在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();
            }
        }
    }