gpt4 book ai didi

wpf - 在命名样式之间切换

转载 作者:行者123 更新时间:2023-12-04 20:27:30 25 4
gpt4 key购买 nike

几个月前,在一个 C# 应用程序中,我开始使用 ListBox 作为一些 UserPanel 的容器。选择面板时,它会突出显示,就像任何列表框项目一样。我发现我能够添加以下 XAML 来为所有项目提供透明背景(不确定我最初在哪里找到它或者我会链接它)

<Application.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="border" Background="Transparent">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="border" Property="Background">
<Setter.Value>Transparent</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>

这很好用,但现在我有时需要背景颜色而不是透明背景。只有 1 个列表框,内容发生变化,所以我想以编程方式更改代码隐藏中的样式。

我在代码中找到了更改样式的示例,但我无法创建两个相同的样式。我给它一个 x:name="transparentListbox",复制它,并给另一个 x:name="normalListbox"背景为蓝色,但我得到一个具有两个样式元素的 XML 解析异常,可能是因为它们都是通常尝试修改每个列表框。

我如何才能拥有两个命名样式来完成相同的事情(选择项目时修改背景),我可以根据需要在代码中切换?


编辑:

在每种情况下,我的列表框都用于存储 UserPanel。我使用 lstPanels.Items.Add(p) 将它们添加到列表框中,其中 p 是从 UserPanel 派生的类的实例。

当我第一次制作应用程序时,有多个窗口,因此需要透明的窗口具有这种样式,而需要选择项目的窗口则没有。管理多个窗口变得很麻烦,因此它被重构为一个窗口,当模式改变时,列表框将被清除并加载不同类型的面板。有些仍然需要透明背景,但现在有些不需要。

当模式发生变化时,以编程方式将命名样式分配给整个列表框是可以的。为每个 ListBoxItem 分配样式将涉及更新大量代码,因为该功能已扩展。

也许解决方案是保持单一样式,但将背景属性绑定(bind)到变量,如果可能的话?

最佳答案

我一直在我的 UserControl.Resources 部分创建样式。

在你的情况下:

<Style x:Key="ListBoxStyle1" TargetType="MyDerivedListBoxItem">

...

<Style x:Key="ListBoxStyle2" TargetType="MyDerivedListBoxItem">

...

并且在后面的代码中,我以这种方式设置了样式。

If Not MyListBox.ItemContainerStyle.Equals(CType(Resources("ListBoxStyle1"), Style)) Then
MyListBox.ItemContainerStyle= CType(Resources("ListBoxStyle1"), Style)

关于wpf - 在命名样式之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8379015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com