更改窗口 (WPF) 的内容

本文关键字:WPF 窗口 | 更新日期: 2023-09-27 17:55:40

我创建了一个简单的WPF应用程序,它有两个Windows。用户在第一个窗口中填写一些信息,然后单击"确定",这将把他们带到第二个窗口。这工作正常,但我正在尝试将两个 Windows 合并到一个窗口中,以便仅更改内容。

在更改窗口内容时,我设法找到了此资源管理,这似乎是我所追求的。但是,我已经搜索了ContentPresenter,但找不到太多关于我需要如何使用它的帮助。例如,如果我使用 ContentPresenter,则应将两个 Windows 中的现有 XAML 元素放在哪里?我猜第一个窗口将进入内容演示器,但第二个窗口需要放在需要切换时放在某个地方。

任何帮助都会很棒。一个简单的工作示例会更好。

蒂亚

更改窗口 (WPF) 的内容

ContentPresenter通常在

重新设置现有控件的样式时使用。它是放置控件内容的位置。相反,您应该使用 ContentControl ,它只是一个具有内容元素的控件。或者,您可以直接设置窗口的内容。

将两个现有窗口的内容提取到两个用户控件中。然后,创建一个将托管内容的新窗口。根据您的业务逻辑,将该窗口的内容(如果需要其他"主"内容,则设置为该窗口的 ContentControl)为这两个用户控件之一。

编辑:

作为起点。这不是完整的工作代码,只是为了帮助您入门。请注意,这是糟糕的架构;一旦你开始运行它,你可能应该使用 MVVM 或类似的方法!

<Window>
    <ContentControl Name="ContentHolder" />
</Window>
<UserControl x:Class="MyFirstUserControl" /> <!-- Originally the first window -->
<UserControl x:Class="MySecondUserControl" /> <!-- Originally the second window -->

在窗口的代码隐藏中:

// Somewhere, ex. in constructor
this.ContentHolder.Content = new MyFirstUserControl;
// Somewhere else, ex. in reaction to user interaction
this.ContentHolder.Content = new MySecondUserControl;

我使用ContentPresenter来捕捉内容。在窗口中,我放了这样的东西:

<ContentPresenter Content="{Binding MainContent}" />

在视图模型中,我有一个名为 MainContent 的属性,类型为 object:

public object MainContent { get { return (object)GetValue(MainContentProperty); } set { SetValue(MainContentProperty, value); } }
public static readonly DependencyProperty MainContentProperty = DependencyProperty.Register("MainContent", typeof(object), typeof(SomeViewModel), new FrameworkPropertyMetadata(null));

无论您将 MainContent 设置为什么,都会显示在窗口中。

为了保持视图和视图模型之间的分离,我通常将 MainContent 属性设置为另一个视图模型,并使用数据模板将该视图模型映射到视图:

<DataTemplate DataType="{x:Type viewmodels:PlanViewModel}">
    <views:PlanView />
</DataTemplate>

我将该数据模板与一堆其他视图模型到视图映射器一起放入某个中央资源字典中。