211

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

我的选择似乎是

  • 窗户
  • 用户控制

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

有人可以为我解释这些差异,并举例说明您可以将每种情况/应用程序用于哪些情况/应用程序?

4

5 回答 5

373

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

页面是窗口内的页面。它主要用于基于 Web 的系统,例如 XBAP,在其中您有一个浏览器窗口,并且可以在该窗口中托管不同的页面。它也可以用在像sellmeadog所说的导航应用程序中。

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

在窗口之间导航时,您可以简单地创建一个新Window对象并显示它

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

但就像我在这个答案开头所说的那样,如果可能的话,我不喜欢管理多个窗口。

我首选的导航方法是使用 a 创建一些动态内容区域,并使用包含当前视图的任何内容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>

截图1 截图2

于 2012-08-31T13:11:55.837 回答
14
  • 窗口就像Windows.Forms.Form,所以只是一个新窗口
  • 根据在线文档,页面是:

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

    所以如果你想可视化一些 HTML 内容,你基本上会使用它

  • UserControl适用于您想要创建一些可重用组件(但不是独立组件)以在多个不同的情况下使用它的情况Windows

于 2012-08-30T21:58:50.097 回答
7

一切都取决于您要构建的应用程序。Window如果您正在构建基于对话框的应用程序,请使用s。Page如果您正在构建基于导航的应用程序,请使用s 。UserControls 将非常有用,因为您可以在 Windows 和 Pages 中使用它们。

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

于 2012-08-30T21:59:28.387 回答
6

我们通常将 One MainWindow用于应用程序,而其他窗口可以在需要弹出窗口的情况下使用,因为我们可以使用在设计时可见的窗口,而不是在 XAML 中使用不可见的弹出控件,这样就很容易了跟...共事

另一方面,我们使用许多页面从一个屏幕导航到另一个屏幕,例如用户管理屏幕到订单屏幕等。在主窗口中,我们可以使用Frame控件进行导航,如下面的 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 添加页面,同时添加新页面检查控件是否已存在然后仅导航,否则添加和导航。我希望这会帮助某人

于 2013-08-28T09:35:01.803 回答
2

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

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

关于 WPF 的页面和窗口之间的区别:WPF 中的页面与窗口?

于 2013-05-25T10:40:26.853 回答