改变窗口内容(WPF)

12

我创建了一个简单的WPF应用程序,其中有两个窗口。用户在第一个窗口上填写一些信息,然后点击“确定”,将会转到第二个窗口。这个功能很好,但我试图将两个窗口合并成一个窗口,只更改内容。

我找到了这个更改窗口内容时的资源管理,看起来似乎是我需要的。但是,我搜索ContentPresenter,没有找到如何使用它的帮助。例如,如果我使用ContentPresenter,在哪里放置现有的两个窗口中的XAML元素?我猜第一个窗口将进入ContentPresenter,但第二个窗口需要放在某个地方以便在需要切换时使用。

任何帮助都将是伟大的。一个简单的工作示例会更好。

TIA

2个回答

13

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

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

编辑:

这只是一个起点,并不是完整可工作的代码。请注意这是不好的架构;一旦你让它运行起来,你应该考虑使用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;

好的,我一直在为这个问题苦苦思索。我已经将之前的两个窗口提取到了一个UserControl中。我创建了一个包含ContentControl的新窗口,并希望首先将其分配给其中一个UserControl。稍后,我想切换到另一个UserControl。然而,我很难找到如何设置第一个UserControl,更不用说如何稍后切换它了。有没有什么帮助或指向一些示例网站的指针? - millie
当您更改窗口内容时,程序会闪烁(如闪烁),原因是什么? - user983652
@fake 你所说的闪烁/点亮是什么意思?你能具体说明吗? - Daniel Rose
好的,这里有更多的细节:我有一个简单的组合框,它允许WPF窗口更改其内容。当组合框项选择发生变化时,WPF窗口会切换到不同的用户控件。private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (cmbxMain.SelectedIndex) { - user983652

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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接