如何在WPF设计器中禁用自定义窗口渲染?

如何在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”类型,不能在此常

我已经创建了窗口派生类(WindowAttachedCollection.MyWindow)和包含这些窗口集合的附加属性。但是VS 2010中的WPF designer尝试为该集合中的每个窗口创建WindowInstance对象,并引发ArgumentException:

值“Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance”不是“WindowAttachedCollection.MyWindow”类型,不能在此常规集合中使用。 参数名称:value

所以它打破了WPF设计器

有没有办法在WPF设计器中禁用实例化WindowInstance而不是MyWindow?目前,我不需要为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
,如下所述:


我决定将MyWindow的基类从Window更改为ContentControl。就我们的目的而言,这就足够了。当每个ContentControl处于活动状态时,会将其包装到一个窗口中。

感谢您的回复,但我如何使用它?我试图给附加属性的getter和setter设置一些条件,但也抛出了异常。理想的方法是设计器忽略此附加属性。@Kolyk请参阅,谢谢您的帮助。但现在还不需要。
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;
}