【问题标题】:Disable Style in WPF XAML?在 WPF XAML 中禁用样式?
【发布时间】:2011-08-04 17:45:53
【问题描述】:

有没有以编程方式关闭样式?

例如,我有一个链接到所有文本框的样式

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

我想添加一些代码来真正停止正在使用的样式元素,所以基本上恢复到默认控件样式。

我需要一种方法来切换我的样式,这样我就可以通过 C# 代码在 Windows 默认样式和我的自定义样式之间切换。

有没有办法做到这一点?

谢谢

工作解决方案

Switching between themes in WPF

【问题讨论】:

    标签: c# wpf xaml styles


    【解决方案1】:

    为了将样式设置为默认,

    在 XAMl 使用中,

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

    在 C# 中使用,

    myTextBox.Style = null;
    

    如果需要为多个资源设置样式为 null,请参阅 CodeNaked 的 回复。


    我觉得,所有其他信息都应该在您的问题中,而不是在 cmets 中。无论如何,在后面的代码中,我认为这就是您要实现的目标:

    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);
    }
    

    【讨论】:

    • 如果我要更改所有 TextBox 的样式,然后再将其更改回以前使用的样式,怎么样?
    • 我认为这不适合我的需要。 atm 我有一种针对所有文本框的样式。我希望能够将程序中的每个文本框从我设置的自定义样式中恢复,并将其设为 null,以便它可以恢复为 Windows 默认值。并且还有 C# 代码将其更改回我的自定义样式。有什么可能吗?谢谢
    • 这是您在测试默认样式的应用程序时所做的事情,还是在您的应用程序中实现“切换到默认样式”功能?如果它正在测试,那么只需在 XAML 中设置 null 样式并稍后将其删除。
    • 这是一种将我的应用程序中的样式切换为默认样式并在用户愿意的情况下切换回自定义样式的方法。所以我需要在这端打开一个开关
    • 谢谢 我在使用 SetDefault 时遇到错误:项目已添加。在字典中键入:'System.Windows.Controls.TextBox' 正在添加的键:'System.Windows.Controls.TextBox'
    【解决方案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>
    

    在上面的示例中,只有 Grid 的隐式样式会应用于 Grid 中的 TextBox。您甚至可以通过编程方式将其添加到 Grid 中,例如:

    this.grid.Resources.Add(typeof(TextBox), new Style() { TargetType = typeof(TextBox) });
    

    【讨论】:

      【解决方案3】:

      我知道答案已被接受,但我想添加我的解决方案,该解决方案在以下情况下效果很好:

      • 一个使用 mahapps.metro 的主要应用程序
      • 从主应用程序导入的附加项目不参考 mahapps.metro,它作为插件导入(动态加载编译的 .dll)
      • 使用 将所有内容重新设置为 null,因此 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>
      

      这成功地将主应用程序样式应用到 内的控件

      【讨论】:

        【解决方案4】:

        在 Xaml 中,您可以通过显式设置样式来覆盖它。在代码隐藏中,您也可以显式设置样式。

        <TextBox Style="{StaticResource SomeOtherStyle}"/>
        
        myTextBox.Style = Application.Resources["SomeOtherStyle"];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-20
          • 2015-02-04
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          • 2016-12-11
          相关资源
          最近更新 更多