条件资源创建WPF XAML设计/运行时

关于WPF级联绑定的第一个问题,

我注意到我在MainWindowUserControls中定义了比预期更多的资源

这在Snoop中很常见

bindingMCVE snoop视图

  • MainWindow XAML有一个MainWindow ViewModel的“实例”,用绿色蓝色绘制2个用户控件

测试2 UserControls的应用

  • 另外,2个UserControl中的每一个都有2个usercontrol视图模型的实例,它们将内部圆圈涂成红色

简单的用户控制

  1. 我在Usercontrol中的第一个意图是能够看到“ 实时 ”我的控件的样子(我把它涂成红色以区分这个“模型”与主窗口中的绿色和蓝色圆圈)
  2. 我的资源创建非常便宜,所以无论我是否有2个额外的资源仍然存在于我的应用程序中,但我预计我的资源将更昂贵的时间…

最后我的问题是:

我怎样才能在“低级”控件中创建资源(这样我可以在控件的视图中进行预览) 在运行完整的应用程序(或主窗口的视图)时阻止这种创建,因为我会绑定到此上一级的资源。

提前谢谢了。

最好的祝福。

NGI

我准备了简化的方法,在设计时显示一个数据,后者在运行时显示。 希望你会发现它很有用并适应你的情况。

XAML:

                 

转换器:

  class IsInDesignModeConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) return values[0]; return values[1]; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

因此,它在设计时显示设计模式文本,在运行时显示运行时。 在您的情况下,您可以插入已定义的资源而不是TextBlock。

我终于试着回答我自己的问题了

结果是等待在较低级别ViewModel实例中没有“重复资源”结果在snoop中: 窥探视图。只有mainwindow viewmodel实例

XAML代码

          

注意新行:

d:DataContext =“{d:DesignInstance {x:Type vm_nmspc:my_usercontrol_vm},IsDesignTimeCreatable = True}”

并且绝对没有其他修改!

诀窍是使用IDE来支持你( 如果你不知道将导致XAML的语法 )。

我会试着说明我做了什么。

选择对象,然后在格式菜单中选择Set Design Time DataContext

设置设计时DataContext

然后选择你的DesignInstance( 这里是ViewModel my_usercontrol_vm )并且不要忘记勾选IsDesignTimeCreatable

在此处输入图像描述

这在Ellipse声明中创建了魔术线,但我将它移到了XAML的顶部。

所以这回答了我的问题。 在没有WPF / XAML的深入知识的情况下,可以“渲染”所有子视图(控件),而无需视图模型浪费资源的额外成本

为了回应Maximus在第一个答案中给出的内容,我发现了另一个post(将尝试再次找到它并在下一个编辑中引用它)直接使用函数DesignerProperties.GetIsInDesignMode()

 public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); if ( DesignerProperties.GetIsInDesignMode(this)) { //Do what you want here for design time specific actions } } }