Цвет фона только для времени разработки в WPF? - PullRequest
28 голосов
/ 31 января 2012

В WPF XAML есть удобные DesignHeight и DesignWidth, например, в коде как

<UserControl ... d:DesignHeight="500" d:DesignWidth="500" ... />

, что прекрасно, потому что я могу построить макет с представителем , но не заблокирован , размер элемента управления.

Однако я часто создаю темные интерфейсы, где надписи и т. д. должны быть белыми, но моим элементам управления по-прежнему нужен прозрачный фонцвет.Это создает неудобства во время разработки, поскольку белый цвет кажется прозрачным цветом фона для прозрачных элементов управления в конструкторе, что приводит к нечитаемым меткам белого на белом.

Есть ли способ или стратегия для настройки дизайна -время цвета фона, с таким же удобством, как DesignHeight / DesignWidth?

Ответы [ 5 ]

29 голосов
/ 29 ноября 2016

Недокументированное свойство d:DesignStyle типа Style, которое вы можете установить в пользовательском элементе управления.Этот стиль применяется только в конструкторе и не используется во время выполнения.

Вы используете его следующим образом:

<UserControl ... d:DesignStyle="{StaticResource MyDesignStyle}" />

Или вот так:

<UserControl ...>
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">...</Style>
    </d:DesignerProperties.DesignStyle>
</UserControl>

Примечаниеоднако любое значение, установленное в свойстве Style (которое используется во время выполнения), также переопределит DesignStyle в конструкторе.

9 голосов
/ 31 января 2012

Я обнаружил, что вы можете сделать один для себя. Настраиваемые атрибуты времени разработки в Silverlight и дизайнере WPF - это руководство, как это сделать для Silverlight и WPF.

8 голосов
/ 15 июня 2012

Мой ответ был найден здесь: Черный фон для XAML Editor .Существует несколько вариантов, включая проверку System.ComponentModel.DesignerProperties.GetIsInDesignMode(this) во время выполнения.

1 голос
/ 08 декабря 2017

Техника d:DesignerProperties.DesignStyle, показанная на этой странице, отлично подходит для применения стиля WPF только для времени разработки к одиночному элементу управления , но, похоже, не работает для Style в ResourceDictionary, который будет применяться к всем элементов управления или элементов с соответствующей типизацией в области действия словаря. Ниже приведено простое решение, которое я нашел для развертывания стиля только для дизайнера в ResourceDictionary.

Рассмотрим, например, Window, содержащий TreeView, где мы хотим, чтобы узлы TreeViewItem отображались как полностью развернутые, но только во время разработки. Сначала поместите желаемый стиль в словарь XAML обычным способом.

<Window.Resources>
    <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="True" />
    </Style>
</Window.Resources>

Здесь Style помещается в ResourceDictionary из Window, но, конечно, вы могли бы использовать любой другой словарь для подстановки. Затем, в коде C #, удаляет стиль из Resource­Dict­ionary, когда режим разработки не обнаружен . Сделайте это в OnInitialized переопределении:

protected override void OnInitialized(EventArgs e)
{
    if (DesignerProperties.GetIsInDesignMode(this) == false)
        Resources.Remove(typeof(TreeViewItem));

    base.OnInitialized(e);
}

Режим разработки: Режим выполнения:

design mode runtime mode

0 голосов
/ 01 февраля 2018

Это полное решение для DesignBackground:

public class DesignTimeProperties : DependencyObject
    {
        private static readonly Type OwnerType = typeof(DesignTimeProperties);

        #region DesignBackground (attached property)

        public static Brush GetDesignBackground(DependencyObject obj)
        {
            return (Brush)obj.GetValue(DesignBackgroundProperty);
        }

        public static void SetDesignBackground(DependencyObject obj, Brush value)
        {
            obj.SetValue(DesignBackgroundProperty, value);
        }

        public static readonly DependencyProperty DesignBackgroundProperty =
            DependencyProperty.RegisterAttached(
                "DesignBackground",
                typeof (Brush),
                OwnerType,
                new FrameworkPropertyMetadata(Brushes.Transparent,
                    DesignBackgroundChangedCallback));

        public static void DesignBackgroundChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (IsInDesignMode)
            {
                var control = d as Control;
                var brush = e.NewValue as Brush;
                if (control != null && brush != null)
                {
                    control.Background = brush;
                }
            }
        }

        public static bool IsInDesignMode
        {
            get
            {
                return
                    ((bool)
                        DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof (DependencyObject)).DefaultValue);
            }
        }

        #endregion

    }

Использование:

<UserControl ... infra:DesignTimeProperties.DesignBackground="Black" />
...