Отключить стиль в WPF XAML? - PullRequest
25 голосов
/ 04 августа 2011

Есть ли способ отключить стиль программно?

Например, у меня есть стиль, связанный со всеми текстовыми полями

<Style TargetType="{x:Type TextBox}">

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

Мне нужен способ сделать переключение в моих стилях, чтобы я мог переключаться между стилем Windows по умолчанию и моим собственным стилем через C #код.

Есть ли в любом случае, чтобы сделать это?

Спасибо

Рабочий раствор

Переключение между темами в WPF

Ответы [ 4 ]

59 голосов
/ 04 августа 2011

Для установки стиля по умолчанию,

При использовании XAMl,

<TextBox Style="{x:Null}" />

При использовании C #,

myTextBox.Style = 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);
}
20 голосов
/ 04 августа 2011

Вы можете ввести пустой стиль, который будет иметь приоритет над другим вашим стилем. Вот так:

<Window>
    <Window.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Background" Value="Red" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Resources>
            <Style TargetType="TextBox" />
        </Grid.Resources>
    </Grid>
</Window>

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

this.grid.Resources.Add(typeof(TextBox), new Style() { TargetType = typeof(TextBox) });
3 голосов
/ 28 ноября 2014

Я знаю, что ответ принят, но я хочу добавить свое решение, которое отлично работает в следующем сценарии:

  • Одно основное приложение, использующее mahapps.metro
  • дополнительный проектимпортируется из основного приложения без ссылки на mahapps.metro, он импортируется как плагин (загрузка скомпилированного .dll на лету)
  • с помощью изменяет все стили до нуля, поэтому 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>

это успешно применяет основной стиль приложения к элементам управления внутри

1 голос
/ 04 августа 2011

В Xaml вы можете переопределить это, установив стиль явно. В коде позади вы также можете установить стиль явно.

<TextBox Style="{StaticResource SomeOtherStyle}"/>

myTextBox.Style = Application.Resources["SomeOtherStyle"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...