-1

几天前我问了这个问题并得到了一些答案,但没有一个真正帮助我解决了这个问题,所以我正在尝试一种新的方法。

我希望能够设置组合框使用的文本框的颜色(前景、背景和边框),以便它可以根据触发器具有许多不同的值。使用文本框,这很容易,只需在这些属性上使用 setter 即可。

因此,鉴于我有如下触发器:

<Trigger Property="someProperty"  Value="true"> 
    <!-- Insert Setters Here -->
<Setter Property="Foreground"
    Value="Red" />
</Trigger>

我会在上面插入什么设置器来更改组合框使用的文本框的上述 3 种颜色?对于每个触发器,假设每种颜色都会改变。似乎前台工作除了禁用。

我的印象是,根据“IsEnabled”触发器(当为假时)更改颜色可能很棘手,但不知道为什么。但是我需要支持它以及基于自定义附加属性或验证的许多其他触发器。

对于背景,我尝试了很多选项,包括 ComboBox.Background、TextElement.Background、Panel.Background 等,但我得到的只是纯白色背景。

我想到的另一件事是,如果这些应该工作,调用树中可能有一些资源库可能会以不允许我更改它的方式设置背景颜色,但是,如果是这样,如何我能查出来吗?

谢谢!

4

1 回答 1

1

正如我在上一个(现在重复的)问题中告诉你的那样,你需要定义一个新ControlTemplate的来实现你的目标。

备查:

在 StackOverflow 上提出重复的问题是被社区批准的,特别是如果你问的是你自己的问题的重复。如果您不理解您的答案或觉得他们没有充分回答您的问题,您应该请答案作者在问题中进一步解释。

现在我会离开我的肥皂盒,让你在实现目标的道路上更进一步。正如我所说,您将需要定义一个新的ControlTemplate......没有办法解决这个问题。这样做的原因很简单 - 您想添加s 以影响defaultTrigger中定义的 XAML 控件,但您没有其他方法可以从 XAML 中执行此操作。ControlTemplate

那么,我们如何定义一个新的ControlTemplate? 这真的很简单:我们只需在Template属性中定义一些 XAML 来描述我们希望控件的外观和行为方式。请参阅我在您上一篇文章中为您提供的链接以获得帮助。此外,这是一个非常简化的示例:

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <Border Name="Border" CornerRadius="2" Padding="2">
                    <ScrollViewer Margin="0" HorizontalScrollBarVisibility="Disabled" 
VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter />
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Border" Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

将此Style应用于属性设置为的 a ComboBox,您将看到它是红色的。现在你可能在想'那看起来不像',你是对的。那是因为为了简单起见,我只是将默认的所有 XAML 替换为稍微类似于下拉部分的部分。IsEnabledFalseComboBoxComboBox ControlTemplate

您现在的工作是定义您自己ControlTemplate的复制默认 XAML 并添加Trigger我在本文和上一篇文章中向您展示的相关 s。在示例中,请注意如何将Trigger.TargetName设置为Border,这是使用的内部Border控制的名称。您需要为每个要着色的元素执行此操作。

这是控件默认设置的ControlTemplate链接ComboBox。当你看到它有多大时,你就会明白为什么我在示例中没有使用它。

组合框样式和模板

于 2013-10-05T15:41:14.850 回答