问题 更改窗口(WPF)的内容


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

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

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

TIA


4520
2018-05-06 09:31


起源



答案:


一个 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;

11
2018-05-06 09:39



好吧,用这个把我的头靠在墙上。我已将之前的两个窗口解压缩为UserControl。我创建了一个包含ContentControl的新窗口,并希望将其分配给其中一个UserControls。稍后,我想将UserControl切换到另一个。但是,我很难找到如何设置第一个UserControl,更不用说如何在以后切换它。有关此示例网站的任何帮助或指示? - millie
当你改变窗口的内容程序亮起时(如闪烁),是什么原因?
@fake闪烁/亮起是什么意思?你能说得特别吗? - Daniel Rose
好的,这里有更多细节:我有一个简单的组合框,让wpf窗口改变其内容。当组合框项目选择改变时,wpf窗口到达不同的usercontrol。 private void ComboBox_SelectionChanged(object sender,SelectionChangedEventArgs e){switch(cmbxMain.SelectedIndex){


答案:


一个 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;

11
2018-05-06 09:39



好吧,用这个把我的头靠在墙上。我已将之前的两个窗口解压缩为UserControl。我创建了一个包含ContentControl的新窗口,并希望将其分配给其中一个UserControls。稍后,我想将UserControl切换到另一个。但是,我很难找到如何设置第一个UserControl,更不用说如何在以后切换它。有关此示例网站的任何帮助或指示? - millie
当你改变窗口的内容程序亮起时(如闪烁),是什么原因?
@fake闪烁/亮起是什么意思?你能说得特别吗? - Daniel Rose
好的,这里有更多细节:我有一个简单的组合框,让wpf窗口改变其内容。当组合框项目选择改变时,wpf窗口到达不同的usercontrol。 private void ComboBox_SelectionChanged(object sender,SelectionChangedEventArgs e){switch(cmbxMain.SelectedIndex){


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

我把这个数据模板放在一些中央资源字典中,还有一堆其他视图模型到视图的映射器。


3
2018-05-06 14:11