gpt4 book ai didi

wpf - 如何将 UserControl 加载到 (WPF) 窗口中的 ContentPresenter 中?

转载 作者:行者123 更新时间:2023-12-03 10:20:12 28 4
gpt4 key购买 nike

我有一个包含 Viewbox 的窗口。在那个 Viewbox 中,我想拥有我已经创建为 UserControls 的几个 View 之一。我正在使用 MVVM(模型 View View 模型)设计模式。我在网上搜索了大约一个小时,但找不到任何解释如何使用 ContentPresenter 显示 UserControl 的示例或教程。 .

最佳答案

依靠。

我认为您的主要问题是 ContentPresenter仅在控制模板中使用。您不能只是将其粘贴在 Window 中并期望它显示窗口的内容。我相信您真正需要做的是使用 ContentControl托管您的用户界面。

通过将模型绑定(bind)到 Content此控件的属性,您可以设置包含该模型的预期 View 的 DataTemplates。我给你一个简短的例子。请注意,这可能与您的设计不匹配,但它展示了它们是如何结合在一起的。

首先,对于每个 View ,创建一个模型(或 ViewModel)来管理该 View 的数据(和交互)。

public sealed class Dialog : INotifyPropertyChanged // or DependencyObject
{
public string Input {get;set;} // INPC or DP implementation not shown
public ICommand Cancel {get;set;}
// class definition not shown
}

接下来,定义要在 ContentPresenter 中显示的 View
<UserControl x:Class="Herp.DialogView" 
HideImplementationDetails="true">
<Border BorderBrush="Red" BorderThickness="5">
<TextBlock Text="{Binding Input}" />
<Button Command="{Binding Cancel}">Cancel</Button>
<!-- etc etc -->
</Border>
</UserControl>

接下来,在您的窗口中,添加 ContentControl 和 DataTemplate
<Window HideImplementationDetailsForBrevityOfXaml="true">
<Window.Resources>
<DataTemplate xmlns:t="clr-namespace:Herp"
DataType="{x:Type t:Dialog}">
<t:DialogView />
</DataTempalte>
</Window.Resources>
<ContentControl Content="{Binding}" />
</Window>

最后将 Window 的 DataContext 设置为您的 Dialog模型。
public MyWindow()
{
InitializeComponent();
DataContext = new Dialog();
}

逻辑流程是这样的:
  • 您的窗口已创建。
  • 在 DataContext 上设置 Dialog 控件的一个实例。
  • ContentControl 上的绑定(bind)已更新
  • 默认 DataTemplateSelectorContentControl在资源中搜索 DataTemplate谁的DataType设置为 typeof(Dialog)
  • 它在窗口资源
  • 中找到此 DataTemplate
  • 数据模板的内容是loaded并添加为 ContentControl 的视觉子级

  • 随时 ContentContentControl变化,同样的过程重复。因此,您可以拥有许多不同的模型,每个模型都有一个包含不同 UserControl 的不同 DataTemplate,并且每次更新 ContentControl 上的绑定(bind)时,您都会看到预期的 View 。

    使用 MVVM,您可以将 ViewModel 的属性绑定(bind)到 Content属性(将其称为 Current 或其他名称),然后根据 ViewModel 的当前状态将属性中的模型切换为预期值。注意,在 ContentControl 中,任何设置为 Content属性变为 DataContext ContentControl 的直接子级。类似于每个 ItemsSourceItemsControl 内是 DataContext ItemTemplate 中定义的可视化树.

    关于wpf - 如何将 UserControl 加载到 (WPF) 窗口中的 ContentPresenter 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13806473/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com