更改窗口(WPF)的内容

时间:2011-05-06 09:31:42

标签: c# wpf contentpresenter

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

我设法找到了这个Resource management when changing window content,这似乎就是我所追求的。但是,我搜索了ContentPresenter,但找不到我需要使用它的帮助。例如,如果我使用ContentPresenter,我在哪里放置两个Windows中的现有XAML元素?我猜第一个Window将进入ContentPresenter,但第二个将需要放在需要切换的地方。

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

TIA

2 个答案:

答案 0 :(得分:11)

重新安排现有控件时通常会使用ContentPresenter。它是放置控件内容的地方。相反,您应该使用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;

答案 1 :(得分:3)

我使用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>

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