【问题标题】:wpf comboBox coloring issuewpf组合框着色问题
【发布时间】:2013-10-03 07:54:12
【问题描述】:

由于要求,我需要一个组合框,其工作方式如下:

它使用: - 在查看模式下一组用于前/背景的颜色 - 在编辑模式下的第二组前/背景颜色 - 选定模式的另一组(当光标在组合框中时) - 另一组禁用模式

用户将永远无法编辑内容,只需单击向下箭头并从列表中选择。

除了颜色之外,我的组合框都在工作。与其他控件不同,简单地尝试执行以下操作(编辑模式的触发器)是行不通的:

<MultiTrigger>
<MultiTrigger.Conditions>
    <Condition Property="IsFocused"
         Value="false" />
    <Condition Property="wpfMisc:myCtrl.viewMode"
         Value="false" />
    <Condition Property="IsEnabled"
         Value="true" />
</MultiTrigger.Conditions>
<Setter Property="BorderBrush"
    Value="{DynamicResource controls-editableBorderBrush}" />
<Setter Property="Background"
    Value="{DynamicResource controls-editableBackgroundBrush}" />
<Setter Property="Foreground"
    Value="{DynamicResource controls-editableForegroundBrush}" />
</MultiTrigger>

我需要在我的样式中设置什么,以便我可以更改显示的 SelectedItem 的前/后颜色 - 即使上述工作有效?

我很好奇是否有人能告诉我为什么这样的控件不使用与其他数据输入控件类似的界面(这不就是多态性的全部概念吗?)这没什么大不了的,只是好奇,仅此而已。

谢谢!

【问题讨论】:

  • 您是否尝试将#eeeeee(或其他)放入值中?只是为了看看动态资源是否运作良好
  • 老兄...查找“多态性”...这与您所说的完全无关...作为开发人员,您真的应该知道什么是的。
  • 是的,我尝试使用标准颜色(红色、蓝色等)没有帮助。
  • Sheridan - 请阅读:en.wikipedia.org/wiki/Polymorphism_(computer_science) - 但这里是开场白:“为不同类型的实体提供单一接口。”我相信这就是我要问的......
  • 老兄,如果这就是你认为多态的意思,那你就有问题了。它涉及具有多个具有相同名称但输入参数不同的方法的能力,以及扩展类和基类之间的公共接口。维基百科不是学习编程的好地方。不过,别生气,我会尽力帮忙的。

标签: wpf xaml combobox


【解决方案1】:

您并没有按照您目前正在努力实现的方式实现您所追求的目标。不需要使用MultiTrigger,只需使用多个连续的Trigger 对象即可:

<ComboBox Width="150" Height="24">
    <ComboBox.Style>
        <Style>
            <Setter Property="ComboBox.Background" Value="Green" />
            <Style.Triggers>
                <Trigger Property="ComboBox.IsFocused" Value="True">
                    <Setter Property="ComboBox.Background" Value="Red" />
                </Trigger>
                <Trigger Property="ComboBox.IsEnabled" Value="False">
                    <Setter Property="ComboBox.Background" Value="Blue" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

现在,我在这里向您展示了 IsEnabled Trigger,以证明您可以像这样添加多个 Trigger 对象。但是,您实际上不能将这个Trigger 用于IsEnabled,因为在默认ComboBox 中定义了一个Trigger,该属性上已经设置了一个Trigger(使其看起来被禁用)。如果您绝对必须IsEnabled 添加Trigger,那么您必须为ComboBox 实现自己的ControlTemplate 以覆盖该默认行为。如果是这种情况,请查看 MSDN 上的 ControlTemplate Class 页面或提出新问题以寻求帮助。

解决您对“查看模式”的其他要求有点棘手。您提供的代码看起来像是在尝试直接从类中检索值,而不是从该类的实例中检索。在 WPF 中,我们通常将public 属性添加到我们可以绑定到的视图模型或代码隐藏文件中。

所以我想你可以有一个名为IsViewModebool 属性,然后你会像这样添加另一个Trigger

                <Trigger Property="IsViewMode" Value="True">
                    <Setter Property="ComboBox.Background" Value="Orange" />
                </Trigger>

但是,如果您的原始语法正确,那么您的 Trigger 将如下所示:

                <Trigger Property="wpfMisc:myCtrl.viewMode" Value="True">
                    <Setter Property="ComboBox.Background" Value="Orange" />
                </Trigger>

【讨论】:

  • 如果他在 Border 中组合 cb 并触发该控件会怎样?
  • 那么只有Border会改变颜色,但大部分会被ComboBox隐藏,所以我们最多只能看到边缘周围的笔划/线条改变颜色。
  • 实际上,最后一个示例是我正在使用的,并且适用于其他控件。 ViewMode 一直在视图模型中,并且附加属性绑定到它。我只是将其包含在内,以便人们可以看到我如何知道我处于查看模式(仅查看与禁用 - 2 种不同的东西。)
  • 我同意多重触发器 - 我一直在使用这种方法,直到一切正常,因为它非常清楚颜色适用的条件。一旦一切正常,我打算删除多余的设置。
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多