Как отключить отображение пользовательских окон в дизайнере WPF? - PullRequest
0 голосов
/ 28 апреля 2011

Я создал производный от окна класс (WindowAttachedCollection.MyWindow) и прикрепил свойство, которое содержит коллекцию этих окон. Но дизайнер WPF в VS 2010 пытается создать объект WindowInstance для каждого окна в этой коллекции и выдает исключение ArgumentException:

Значение «Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance» не относится к типу «WindowAttachedCollection.MyWindow» и не может использоваться в этой универсальной коллекции. Имя параметра: значение

Так что ломается дизайнер WPF.

Есть ли способ отключить создание экземпляра WindowInstance вместо MyWindow в конструкторе WPF? В настоящее время мне не требуется поддержка во время разработки для этой коллекции 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;
}

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Поскольку ваш код будет фактически выполняться во время разработки, вы можете просто заставить его условно сделать что-то, что заставит дизайнера не делать ничего неприятного, насколько это возможно. Для этого вам нужно иметь возможность программно определять, что вы работаете в конструкторе, и вы можете использовать DesignerProperties.IsInDesignModeProperty для этого, как описано здесь:

0 голосов
/ 02 мая 2011

Я решил изменить базовый класс MyWindow с Window на ContentControl.Для наших целей этого достаточно.Каждый ContentControl оборачивается в окно, когда становится активным.

...