Отключить стиль в WPF XAML?
Есть ли способ программно отказаться от стиля?
В качестве примера у меня есть стиль, связанный со всеми текстовыми полями
<Style TargetType="{x:Type TextBox}">
Я хотел бы добавить некоторый код, чтобы фактически остановить используемые элементы стиля, поэтому в основном вернемся к стандарту управления по умолчанию.
Мне нужно сделать способ переключения в мои стили, поэтому я могу переключаться между стилем Windows по умолчанию и моим пользовательским стилем с помощью кода на С#.
Есть ли способ сделать это?
Спасибо
Рабочее решение
Переключение между темами в WPF
Ответы
Ответ 1
Для установки стиля по умолчанию
В XAMl используйте
<TextBox Style="{x:Null}" />
В использовании С#,
myTextBox.Style = null;
Если стиль должен быть установлен как null для нескольких ресурсов, см. ответ CodeNaked.
Я чувствую, вся дополнительная информация должна быть в вашем вопросе, а не в комментариях. В любом случае, в коде. Позади я думаю, что это то, чего вы пытаетесь достичь:
Style myStyle = (Style)Application.Current.Resources["myStyleName"];
public void SetDefaultStyle()
{
if(Application.Current.Resources.Contains(typeof(TextBox)))
Application.Current.Resources.Remove(typeof(TextBox));
Application.Current.Resources.Add(typeof(TextBox),
new Style() { TargetType = typeof(TextBox) });
}
public void SetCustomStyle()
{
if (Application.Current.Resources.Contains(typeof(TextBox)))
Application.Current.Resources.Remove(typeof(TextBox));
Application.Current.Resources.Add(typeof(TextBox),
myStyle);
}
Ответ 2
Вы можете ввести пустой стиль, который будет иметь приоритет над вашим другим стилем. Например:
<Window>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Red" />
</Style>
</Window.Resources>
<Grid>
<Grid.Resources>
<Style TargetType="TextBox" />
</Grid.Resources>
</Grid>
</Window>
В приведенном выше примере в TextBoxes в Grid будет применяться только неявный стиль Grid. Вы можете даже добавить это в Grid программно, например:
this.grid.Resources.Add(typeof(TextBox), new Style() { TargetType = typeof(TextBox) });
Ответ 3
Я знаю, что ответ принят, но я хочу добавить свое решение, которое отлично работает в следующем сценарии:
- Одно основное приложение, использующее mahapps.metro
- дополнительный проект, импортированный из основного приложения без ссылки на mahapps.metro, импортируется как плагин (загрузка скомпилированных DLL на лету)
- с использованием <ToolBar> перерисовывает все до нуля, поэтому стили mahapps.metro не применяются к элементам внутри панели инструментов.
- usercontrol используется для предоставления настраиваемых элементов управления главному приложению.
в корневом элементе управления пользователя задаются ресурсы:
<UserControl.Resources>
<Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" />
<Style x:Key="ComboBoxStyle" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}" />
</UserControl.Resources>
тогда код панели инструментов может быть следующим
<ToolBar>
Block Template:
<ComboBox Style="{StaticResource ComboBoxStyle}"/>
<Button Content="Generate!" Style="{StaticResource ButtonStyle}"/>
</ToolBar>
это успешно применяет основной стиль приложения к элементам управления внутри <ToolBar>
Ответ 4
В Xaml вы можете переопределить это, указав стиль явно. При кодировании кода вы также можете явно задать стиль.
<TextBox Style="{StaticResource SomeOtherStyle}"/>
myTextBox.Style = Application.Resources["SomeOtherStyle"];