【发布时间】:2012-01-12 19:43:04
【问题描述】:
几个月前,在一个 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 个列表框,内容发生变化,所以我想以编程方式更改代码隐藏中的样式。
我找到了更改代码样式的示例,但我无法创建两个相同的样式。我给它 ax:name="transparentListbox",复制它,然后给另一个 x:name="normalListbox" 背景为蓝色,但我得到一个 XML 解析异常,它有两个样式元素,可能是因为它们都是一般尝试修改每个列表框。
我怎样才能让两个命名样式完成相同的事情(选择项目时修改背景),我可以根据需要在代码中切换?
编辑:
在每种情况下,我的列表框都用于存储用户面板。我使用 lstPanels.Items.Add(p) 将它们添加到列表框中,其中 p 是派生自 UserPanel 的类的实例。
当我第一次制作应用程序时,有多个窗口,因此需要透明的窗口具有这种样式,而需要选择项目的窗口则没有。管理多个窗口变得很麻烦,因此将其重新分解为单个窗口,并且当模式更改时,列表框将被清除并加载不同类型的面板。有些仍然需要透明背景,但现在有些不需要。
当模式改变时,以编程方式将命名样式分配给整个列表框是可以的。为每个 ListBoxItem 分配样式将涉及更新大量代码,因为该功能已展开。
也许解决方案是保持单一样式但将背景属性绑定到一个变量,如果这可能的话?
【问题讨论】: