Как показано в этой записи , вы можете сжать код до одного стиля с помощью триггера, поскольку DesignerProperties.IsInDesignMode
является присоединенным свойством .
На самом деле код там не совсем правильный.Он определяет неявный стиль для TargetType="{x:Type UserControl}"
, который в любом случае будет игнорироваться во время выполнения, поскольку ваш UserControl на самом деле является производным классом - как Metro Smurf указывает в своей первой точке:
App.xaml будет влиять на UserControl во время разработки, поскольку типизированный стиль применяется к объекту автоматически, но не применяется к производному объекту (в данном случае UserControl).Поэтому во время разработки VS считает, что должен применять стиль, но во время выполнения он будет игнорироваться.
Правильный способ сделать это - дать ему ключ и применить его вручную кваши UserControls:
<Application
...
xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework">
...
<Application.Resources>
...
<Style x:Key="DesignerBlackBackgroundStyle" TargetType="Control">
<Style.Triggers>
<Trigger Property="componentModel:DesignerProperties.IsInDesignMode"
Value="True">
<Setter Property="Background" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
и:
<UserControl x:Class="MyUserControl"
Style="{StaticResource ResourceKey=DesignerBlackBackgroundStyle}">
В качестве триггера это дает дополнительное преимущество по сравнению с установкой фона в коде позади - он будет работать правильно, если фонявно установлен где-то еще, например, из содержащего UserControl:
<UserControl x:Class="ContainerUserControl" ...>
...
<local:MyUserControl Background="Gray" />
Локальные значения имеют приоритет над триггерами стиля , поэтому на этом экране дизайнер будет использовать серый фон, тогда как он будетбыть черным при проектировании MyUserControl
автономный.