我目前正在编写一个桌面应用程序,但我似乎不能得到我的头当重定向某人到应用程序的新部分使用什么。

我的选择似乎是

窗口 页面 用户控件

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

谁能给我解释一下它们的不同之处,并举例说明你们可以在哪些情况/应用中使用它们?


Window就像Windows.Forms。形式,所以只是一个新的窗口 根据在线文档,页面为: 封装可导航到的内容页 并由Windows Internet Explorer、NavigationWindow和Frame托管。 你可以用这个来可视化HTML内容 UserControl用于在多个不同的Windows中创建一些可重用组件(但不是独立组件)


这一切都取决于你要构建的应用程序。如果你正在构建一个基于对话框的应用程序,请使用Windows。如果你正在构建一个基于导航的应用程序,请使用Pages。无论你走到哪个方向,UserControls都是有用的,因为你可以在Windows和Pages中使用它们。

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


一个Window对象就像它的名字一样:它是你的应用程序的一个新的Window。当你想弹出一个全新的窗口时,你应该使用它。在WPF中我不经常使用多个窗口,因为我更喜欢在我的主窗口中放置动态内容,这些内容会根据用户的操作而变化。

页面是窗口内的页面。它主要用于基于web的系统,如XBAP,在这种系统中,您只有一个浏览器窗口,不同的页面可以托管在该窗口中。它也可以用在导航应用程序,如sellmeadog说。

UserControl是一个可重用的用户创建的控件,您可以像添加其他控件一样将其添加到您的UI中。通常,当我想构建一些自定义功能(例如,CalendarControl)时,或者当我有大量相关的XAML代码时,例如使用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设计模式。我在我的博客上有一个非常基本的例子,说明你如何使用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>


大多数人都张贴了正确答案。我想添加一些链接,这样你就可以参考它们,对同样的问题有更清晰和更好的想法:

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

WPF中页面和窗口的区别: WPF中的页面vs窗口?


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

另一方面,我们使用许多页面来从一个屏幕导航到另一个屏幕,如用户管理屏幕到订单屏幕等。在主窗口中,我们可以使用框架控制进行导航,如下所示 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");
        }
    }

这是一种方法,我们也可以使用标签控件而不是Fram,并使用字典添加页面,同时添加新页面检查控件是否已经存在,然后只导航,否则添加和导航。我希望这能帮助到一些人