禁用WPF XAML中的样式
本文关键字:样式 XAML WPF 禁用 | 更新日期: 2023-09-27 18:04:36
是否可以通过编程方式关闭样式?
作为一个例子,我有一个样式链接到所有的文本框
<Style TargetType="{x:Type TextBox}">
我想添加一些代码来实际停止使用样式元素,所以基本上恢复到默认的控件样式。
我需要一种方法来切换我的样式,这样我就可以通过c#代码在Windows默认样式和我的自定义样式之间切换。
有办法吗?
感谢工作方案
在WPF中切换主题
将样式设置为default,
在XAMl中,
<TextBox Style="{x:Null}" />
在c#中使用
myTextBox.Style = null;
如果需要将多个资源的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);
}
您可以注入一个空白样式,它将优先于其他样式。像这样:
<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) });
我知道答案已被接受,但我想添加我的解决方案,在以下场景中工作很棒:
- 使用mahapps.metro 的主要应用
- 从主应用程序导入的附加项目,没有引用mahapps。metro,它作为插件导入(动态加载编译后的.dll)
- 使用<工具栏>将所有样式重新设置为空,因此可能会出现。地铁样式不能应用于工具栏内的项目。工具栏>
- 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>
this成功地将主应用程序样式应用于<工具栏>工具栏>
在Xaml中,您可以通过显式设置样式来覆盖这一点。在代码隐藏中,您还可以显式地设置样式。
<TextBox Style="{StaticResource SomeOtherStyle}"/>
myTextBox.Style = Application.Resources["SomeOtherStyle"];