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" ...>
неэлегантно, но просто.
альтернативный подход, который не включает код:
- установите "визуальные студии 2012" цветовая тема "редактор" найден здесь: http://visualstudiogallery.msdn.microsoft.com/366ad100-0003-4c9a-81a8-337d4e7ace05
- создайте новую пользовательскую тему на основе той, которую вы хотите модифицировать.
- Нажмите кнопку фильтра "показать все элементы" в левом верхнем углу редактора тем
- введите "artboard" в поле поиска в правом верхнем углу редактора темы
- установить "
Cider -> ArtboardBackground
" цвет к другому цвету вашего выбора. - Ура! : 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:DesignerProperties.DesignStyle
, который отлично подходит для применения стиля только для дизайна к один управление, но который, похоже, не работает для Style
на ResourceDictionary
это относится к все надлежаще типизированных элементов в рамках словаря.
чтобы решить эту проблему, на этой же странице я предоставляю простой решение для развертывания стиля только для конструктора в ResourceDictionary
. Вот краткое изложение этого ответа:
во-первых, поместите нужный стиль в словарь XAML обычным способом.
<Window.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
</Window.Resources>
затем, в коде C#,удалить стиль из ResourceDictionary
когда режим конструкция не обнаружены. Сделайте это в OnInitialized
переопределение:
protected override void OnInitialized(EventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(this) == false)
Resources.Remove(typeof(TreeViewItem));
base.OnInitialized(e);
}
Режим Конструктора : Режим Выполнения: