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

时间:2011-04-28 06:32:27

标签: wpf window custom-controls

我创建了窗口派生类(WindowAttachedCollection.MyWindow)和附加属性,它们包含这些窗口的集合。但VS 2010中的WPF设计器尝试为该集合中的每个窗口创建WindowInstance对象,并抛出ArgumentException:

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

所以它破坏了WPF设计师。

有没有办法在WPF设计器中禁用实例化WindowInstance而不是MyWindow?目前,我不需要为此MyWindow集合提供任何设计时支持。

编辑:

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;
}

2 个答案:

答案 0 :(得分:1)

由于你的代码实际上是在设计时执行的,你可以简单地让它有条件地做一些能让设计师在可能的范围内做任何不愉快的事情。要实现此目的,您需要能够以编程方式检测您在设计器下运行,并且可以使用DesignerProperties.IsInDesignModeProperty进行此操作,如下所述:

答案 1 :(得分:0)

我决定将MyWindow的基类从Window更改为ContentControl。就我们的目的而言,这已足够。每个ContentControl在激活时都会被包装到一个窗口中。