11

我创建了一个简单的 WPF 应用程序,它有两个 Windows。用户在第一个窗口上填写一些信息,然后单击“确定”将他们带到第二个窗口。这工作正常,但我试图将两个 Windows 合并到一个窗口中,所以只是内容发生了变化。

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

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

TIA

4

2 回答 2

11

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

您将两个现有窗口的内容提取到两个 UserControl 中。然后你创建一个新的窗口来承载内容。根据您的业务逻辑,您将该窗口的内容(或者如果您想要额外的“主”内容,则将该窗口的 ContentControl)设置为这两个 UserControl 中的任何一个。

编辑:

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

<Window>
    <ContentControl Name="ContentHolder" />
</Window>

<UserControl x:Class="MyFirstUserControl" /> <!-- Originally the first window -->

<UserControl x:Class="MySecondUserControl" /> <!-- Originally the second window -->

在Window后面的代码中:

// Somewhere, ex. in constructor
this.ContentHolder.Content = new MyFirstUserControl;

// Somewhere else, ex. in reaction to user interaction
this.ContentHolder.Content = new MySecondUserControl;
于 2011-05-06T09:39:16.240 回答
3

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

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

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

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>

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

于 2011-05-06T14:11:06.103 回答