开发者

How to disable custom window rendering in WPF designer?

I have created window derived class (WindowAttachedCollection.MyWindow) and attached property which holds collection of these windows. But WPF designer in VS 2010 tries to create WindowInstance object for each window in that collection and it throws ArgumentException:

The value "Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance" is not of type "WindowAttachedCollection.MyWindow" and cannot be used in this generic collection. Parameter name: value

So it breaks WPF designer.

Is there any way how to disable instancing WindowInstance instead of MyWi开发者_StackOverflow中文版ndow in WPF designer? At this time I don't require any design-time support for this collection of MyWindow.

EDIT:

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


Since your code will actually be executed at design time, you can simply have it conditionally do something that will make the designer not do anything unpleasant, to the extent that that is possible. To accomplish this you need to be able to detect programmatically that you are running under the designer and you can use DesignerProperties.IsInDesignModeProperty for that as described here:

  • Detecting design time mode in WPF and Silverlight


I decided to change base class of MyWindow from Window to ContentControl. For our purposes it is sufficient. Each ContentControl is wrapped into a Window when becomes active.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜