如何在WPF设计器中禁用自定义窗口渲染?
我已经创建了窗口派生类(WindowAttachedCollection.MyWindow)和包含这些窗口集合的附加属性。但是VS 2010中的WPF designer尝试为该集合中的每个窗口创建WindowInstance对象,并引发ArgumentException: 值“Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance”不是“WindowAttachedCollection.MyWindow”类型,不能在此常规集合中使用。 参数名称:value 所以它打破了WPF设计器 有没有办法在WPF设计器中禁用实例化WindowInstance而不是MyWindow?目前,我不需要为MyWindow的这个集合提供任何设计时支持 编辑:如何在WPF设计器中禁用自定义窗口渲染?,wpf,window,custom-controls,Wpf,Window,Custom Controls,我已经创建了窗口派生类(WindowAttachedCollection.MyWindow)和包含这些窗口集合的附加属性。但是VS 2010中的WPF designer尝试为该集合中的每个窗口创建WindowInstance对象,并引发ArgumentException: 值“Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance”不是“WindowAttachedCollection.MyWindow”类型,不能在此常
public static readonly dependencPropertyKey对话框propertyKey=dependencProperty.RegisterAttacheThedOnly(
“对话内部”,
类型(可观测采集),
类型(MyWindow),
新属性元数据(空);
公共静态只读DependencyProperty DialogsProperty=DialogsPropertyKey.DependencyProperty;
公共静态void SetDialogs(UIElement元素,ObservableCollection值)
{
元素设置值(对话框属性键,值);
}
公共静态ObservableCollection GetDialogs(UIElement)
{
var dialogs=(ObservableCollection)元素.GetValue(DialogsProperty);
如果(对话框==null)
{
dialogs=新的ObservableCollection();
设置对话框(元素、对话框);
}
返回对话框;
}
因为您的代码实际上是在设计时执行的,所以您可以让它有条件地做一些事情,使设计者不会做任何不愉快的事情,只要这是可能的。要实现这一点,您需要能够以编程方式检测您正在设计器下运行,并且可以使用DesignerProperties.IsInDesignModeProperty
,如下所述:
public static readonly DependencyPropertyKey DialogsPropertyKey = DependencyProperty.RegisterAttachedReadOnly(
"DialogsInternal",
typeof(ObservableCollection<MyWindow>),
typeof(MyWindow),
new PropertyMetadata(null));
public static readonly DependencyProperty DialogsProperty = DialogsPropertyKey.DependencyProperty;
public static void SetDialogs(UIElement element, ObservableCollection<MyWindow> value)
{
element.SetValue(DialogsPropertyKey, value);
}
public static ObservableCollection<MyWindow> GetDialogs(UIElement element)
{
var dialogs = (ObservableCollection<MyWindow>)element.GetValue(DialogsProperty);
if (dialogs == null)
{
dialogs = new ObservableCollection<MyWindow>();
SetDialogs(element, dialogs);
}
return dialogs;
}