条件资源创建WPF XAML设计/运行时
关于WPF级联绑定的第一个问题,
我注意到我在MainWindow和UserControls中定义了比预期更多的资源 :
这在Snoop中很常见
- MainWindow XAML有一个MainWindow ViewModel的“实例”,用绿色和蓝色绘制2个用户控件
- 另外,2个UserControl中的每一个都有2个usercontrol视图模型的实例,它们将内部圆圈涂成红色
- 我在Usercontrol中的第一个意图是能够看到“ 实时 ”我的控件的样子(我把它涂成红色以区分这个“模型”与主窗口中的绿色和蓝色圆圈)
- 我的资源创建非常便宜,所以无论我是否有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中:
XAML代码
注意新行:
d:DataContext =“{d:DesignInstance {x:Type vm_nmspc:my_usercontrol_vm},IsDesignTimeCreatable = True}”
并且绝对没有其他修改!
诀窍是使用IDE来支持你( 如果你不知道将导致XAML的语法 )。
我会试着说明我做了什么。
选择对象,然后在格式菜单中选择Set Design Time 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 } } }