用于WPF导航的Window vs Page vs UserControl?

时间:2012-08-30 21:55:05

标签: c# wpf

我目前正在编写一个桌面应用程序,但在将某人重定向到应用程序的新部分时,我似乎无法理解将要使用的内容。

我的选项似乎是

  • 窗口
  • 用户控件

但我不明白它们之间的区别是什么,以及什么时候我应该使用它们。

有人可以为我解释这些差异,并举例说明你可以使用哪些情况/应用程序?

5 个答案:

答案 0 :(得分:314)

Window 对象听起来就是这样:它是您应用程序的新Window。当你想要弹出一个全新的窗口时,你应该使用它。我不经常在WPF中使用多个Window,因为我更喜欢在我的主窗口中放置基于用户操作而更改的动态内容。

页面是您的窗口中的一个页面。它主要用于基于Web的系统,如XBAP,您可以在其中拥有单个浏览器窗口,并且可以在该窗口中托管不同的页面。它也可以在Navigation Applications sellmeadog said中使用。

UserControl 是一个可重复使用的用户创建的控件,您可以像添加任何其他控件一样添加到UI。通常我想在构建一些自定义功能时创建UserControl(例如,CalendarControl),或者当我有大量相关的XAML代码时,例如View使用MVVM设计模式时。

在窗口之间导航时,您只需创建一个新的Window对象并显示它

var NewWindow = new MyWindow();
newWindow.Show();

但就像我在本回答开头所说的那样,如果可能,我宁愿不管理多个窗口。

我首选的导航方法是使用ContentControl创建一些动态内容区域,并使用包含当前视图的UserControl填充该区域。

<Window x:Class="MyNamespace.MainWindow" ...>
    <DockPanel>
        <ContentControl x:Name="ContentArea" />
    </DockPanel>
</Window>

在导航事件中,您只需使用

进行设置即可
ContentArea.Content = new MyUserControl();

但是如果你正在使用WPF,我强烈推荐MVVM设计模式。我有一个非常basic example on my blog,它说明了如何使用MVVM进行导航:

<Window x:Class="SimpleMVVMExample.ApplicationView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SimpleMVVMExample"
        Title="Simple MVVM Example" Height="350" Width="525">

   <Window.Resources>
      <DataTemplate DataType="{x:Type local:HomeViewModel}">
         <local:HomeView /> <!-- This is a UserControl -->
      </DataTemplate>
      <DataTemplate DataType="{x:Type local:ProductsViewModel}">
         <local:ProductsView /> <!-- This is a UserControl -->
      </DataTemplate>
   </Window.Resources>

   <DockPanel>
      <!-- Navigation Buttons -->
      <Border DockPanel.Dock="Left" BorderBrush="Black"
                                    BorderThickness="0,0,1,0">
         <ItemsControl ItemsSource="{Binding PageViewModels}">
            <ItemsControl.ItemTemplate>
               <DataTemplate>
                  <Button Content="{Binding Name}"
                          Command="{Binding DataContext.ChangePageCommand,
                             RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                          CommandParameter="{Binding }"
                          Margin="2,5"/>
               </DataTemplate>
            </ItemsControl.ItemTemplate>
         </ItemsControl>
      </Border>

      <!-- Content Area -->
      <ContentControl Content="{Binding CurrentPageViewModel}" />
   </DockPanel>
</Window>

Screenshot1 Screenshot2

答案 1 :(得分:13)

  • 窗口Windows.Forms.Form类似,只是一个新窗口
  • 页面是根据online documentation

      

    封装可导航到的内容页面     并由Windows Internet Explorer,NavigationWindow和Frame托管。

    因此,如果你想要一些HTML内容

  • ,你基本上就会使用它
  • UserControl 适用于您想要创建一些可重复使用的组件(但不是独立的组件)以在多个不同的Windows

    中使用它的情况

答案 2 :(得分:5)

全部取决于您尝试构建的应用。如果您正在构建基于对话框的应用,请使用Window。如果您正在构建navigation based app,请使用Page。无论你走的方向如何,UserControl都会很有用,因为你可以在Windows和Pages中使用它们。

开始探索的好地方是:http://windowsclient.net/learn

答案 3 :(得分:3)

我们通常使用一个主窗口作为应用程序,其他窗口可以在需要弹出窗口的情况下使用,因为不是在XAML中使用不可见的弹出控件,我们可以使用在设计时可见的窗口,以便

很容易使用

另一方面,我们使用很多页面从一个屏幕导航到另一个屏幕,如用户管理屏幕到订单屏幕等。在主窗口中我们可以使用Fram控件进行导航,如下所示 XAML

    <Frame Name="mainWinFrame" NavigationUIVisibility="Hidden"  ButtonBase.Click="mainWinFrame_Click">
    </Frame>

C#

     private void mainWinFrame_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (e.OriginalSource is Button)
            {
                Button btn = (Button)e.OriginalSource;

                if ((btn.CommandParameter != null) && (btn.CommandParameter.Equals("Order")))
                {

                    mainWinFrame.Navigate(OrderPage);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }
    }

这是一种方法我们也可以使用Tab Control代替Fram并使用Dictionary添加页面,同时添加新页面检查控件是否已经存在然后只导航否则添加和导航。我希望这能帮助某人

答案 4 :(得分:2)

最重要的是发布了正确答案。我想添加几个链接,以便您可以参考它们并对此有明确和更好的想法:

用户控件:    http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx

与WPF相关的页面和窗口之间的区别:    Page vs Window in WPF?