XAML: как изменить цвет фона только в режиме разработки?

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

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

Я попытался это:

if (System.ComponentModel.DesignerProperties.IsInDesignTool)
{
    LayoutRoot.Background = new SolidColorBrush(Colors.Blue);
}

но это не сработает. Есть советы?

обновление:

Я не понимаю, как это работает для вас. Я создал новое приложение Silverlight 4.0 и вставил эту строку кода в ctor:

public MainPage()
        {
            InitializeComponent();
            LayoutRoot.Background = new SolidColorBrush(Colors.Blue);

        }

<UserControl x:Class="SilverlightApplication3.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot">

    </Grid>
</UserControl>

когда я иду в Дизайнер, я все еще не вижу его как синий. И у меня даже нет никаких условий isInDesignTime. Чего мне здесь не хватает?

спасибо, Кейв!--3-->

6 ответов


вот так:

if (System.ComponentModel.DesignerProperties.IsInDesignTool)
{
    LayoutRoot.Background = new SolidColorBrush(Colors.Yellow);
}

если вы переключитесь на создание шаблонного элемента управления, вам нужно будет подождать, чтобы настроить вещи в OnApplyTemplate, как в этом примере:

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    Border b = this.GetTemplateChild("backBorder") as Border;
    if (b != null && System.ComponentModel.DesignerProperties.IsInDesignTool)
    {
        b.Background = new SolidColorBrush(Colors.Orange);
    }
}

предполагая, что это шаблон:

<Style TargetType="local:TemplatedControl1">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TemplatedControl1">
                <Border x:Name="backBorder"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

#if DEBUG
if (System.ComponentModel.DesignerProperties.IsInDesignTool)
{
    LayoutRoot.Background = new SolidColorBrush(Colors.Yellow);
}
#endif

обратите внимание, что вся эта техника работает только тогда, когда UserControl вы создаете используется в* другое * UserControl / Control во время разработки. Итак, если код, который я предложил выше, помещен в UserControl имени UserControlWithDesignMode, тогда у вас должен быть другой UserControl, UserControlHost, который содержит экземпляр UserControlWithDesignMode control, чтобы увидеть работу поведения во время разработки. Код для текущего редактируемого элемента управления не выполняется при его редактировании. Он выполняется только тогда, когда он содержится в другом хосте (в Silverlight, another UserControl например.)


одним из вариантов было бы дать UserControl цвет фона, а затем переопределить то, где вы его используете. Поэтому, когда вы редактируете UserControl в изоляции, он будет иметь цвет фона; но когда вы редактируете элемент управления, содержащий этот UserControl, вы увидите его с прозрачным фоном, как вы хотите.

таким образом, XAML-файл UserControl будет выглядеть следующим образом:

<UserControl x:Class="MyUserControl" ... Background="DarkBlue">

а затем на другом экране, где вы его используете, вы можете do:

<my:MyUserControl Background="Transparent" ...>

неэлегантно, но просто.


альтернативный подход, который не включает код:

  1. установите "визуальные студии 2012" цветовая тема "редактор" найден здесь: http://visualstudiogallery.msdn.microsoft.com/366ad100-0003-4c9a-81a8-337d4e7ace05
  2. создайте новую пользовательскую тему на основе той, которую вы хотите модифицировать.
  3. Нажмите кнопку фильтра "показать все элементы" в левом верхнем углу редактора тем
  4. введите "artboard" в поле поиска в правом верхнем углу редактора темы
  5. установить "Cider -> ArtboardBackground " цвет к другому цвету вашего выбора.
  6. Ура! : D

Примечание:"Cider -> ArtboardBackground" поле темы цвета найдено в VS2012, но я не могу подтвердить, имеет ли оно то же имя в VS2010


вы можете использовать следующий код в конструкторе UserControl:

на WPF:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
{
    LayoutRoot.Background = new SolidColorBrush( Colors.Blue );
} 

на WPF / Silverlight:

if (DesignerProperties.GetIsInDesignMode( this ))
{
    LayoutRoot.Background = new SolidColorBrush( Colors.Blue );
}

хороший поток, особенно при выполнении некоторых MVVM тот факт, что UserControls появляются на белом, когда они прозрачны, очень раздражает.

Я уверен, что вы можете сделать это в сочетании с состоянием, определенным на основе того, работает ли дизайнер, но я не думаю, что это уменьшит объем работы.

все еще не уверен, как избежать кода в коде позади и избегая необходимости открывать смесь, поэтому, если у кого-то есть предложения, заранее спасибо за публиковать.

Я бы предложил использовать непрозрачность

<my:MyUserControl Background="Transparent" ...>

Это не работает, так как это сделает любые дочерние элементы управления внутри usercontrol невидимыми во время выполнения.

одним из вариантов было бы дать UserControl цвет фона, а затем переопределить то, где вы его используете.

вы пытались установить фон на UserControl? Не знаю почему, но для меня это не работает.

что делает работа заключается в том, чтобы установить фон контента, например

<UserControl x:Class="...">
<StackPanel Background="{StaticResource PhoneChromeBrush}">
...

затем поместите следующий код в конструктор представления

public View() {
    InitializeComponent();

    var c = Content as Panel;
    if (c != null) c.Background = new SolidColorBrush(Colors.Transparent);
}

другая техника упоминается в этом вопросе так использовать недокументированное свойство d:Design­er­Proper­ties.DesignStyle, который отлично подходит для применения стиля только для дизайна к один управление, но который, похоже, не работает для Style на ResourceDictionary это относится к все надлежаще типизированных элементов в рамках словаря.

чтобы решить эту проблему, на этой же странице я предоставляю простой решение для развертывания стиля только для конструктора в ResourceDictionary. Вот краткое изложение этого ответа:


во-первых, поместите нужный стиль в словарь XAML обычным способом.

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

затем, в коде 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