在WPF XAML中禁用样式?

33
有没有办法以编程的方式关闭样式?例如,我有一个与所有文本框关联的样式。
<Style TargetType="{x:Type TextBox}">

我希望添加一些代码来停止使用样式元素,基本上恢复默认的控件样式。

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

有没有什么方法可以做到这一点?

谢谢

可行方案

在WPF中切换主题

4个回答

79

要将样式设置为默认值,

在XAML中使用以下代码:

<TextBox Style="{x:Null}" />
在C#中使用:
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);
}

如果我要更改所有文本框的样式,然后再将其更改回之前使用的样式,怎么样? - Sandeep Bansal
我不认为那适合我的需求。目前,我只有一种样式可以应用到所有的文本框上。我想要能够将程序中的每一个文本框还原回我所设置的默认样式并使其为空,以便它能够恢复成Windows默认样式。同时,我需要C#代码将其更改回我的自定义样式。有这样的可能吗?谢谢。 - Sandeep Bansal
这是一种在我的应用程序中切换样式到默认值并在用户需要时切换回自定义样式的方法。因此,我需要在这一端添加一个开关。 - Sandeep Bansal
再次没有任何变化,我真的不知道为什么它没有做到,是因为我的样式在 app.xaml 中吗? - Sandeep Bansal
是的,样式包含在app.xaml资源中,该代码是在不同的xaml.cs文件中使用的。 - Sandeep Bansal
显示剩余11条评论

23
你可以注入一个空的样式表,这个样式表将优先于你的其他样式表。就像这样:

<style></style>

<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 中的文本框。你甚至可以通过编程方式将其添加到 Grid 中,类似这样:
this.grid.Resources.Add(typeof(TextBox), new Style() { TargetType = typeof(TextBox) });

3
我知道已经有一个被接受的答案,但我想添加我的解决方案,在以下情况下非常有效:
  • 一个主应用程序使用mahapps.metro
  • 从主应用程序导入的其他项目没有引用mahapps.metro,它被作为插件导入(即动态加载编译的.dll文件)
  • 使用< ToolBar>将所有样式重新设置为空,因此mahapps.metro样式不会应用于工具栏内部的项目。
  • 用户控件用于向主应用程序提供自定义控件。

在用户控件的根部设置资源:

<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>内部的控件。


1
在Xaml中,您可以通过显式设置样式来覆盖它。在代码后台中,您也可以显式地设置样式。
<TextBox Style="{StaticResource SomeOtherStyle}"/>

myTextBox.Style = Application.Resources["SomeOtherStyle"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接