Подтвердить что ты не робот

Отключить стиль в WPF XAML?

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

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

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

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

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

Есть ли способ сделать это?

Спасибо

Рабочее решение

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

4b9b3361

Ответ 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"];