【问题标题】:Styling a combobox's PART_EditableTextBox为组合框的 PART_EditableTextBox 设置样式
【发布时间】:2013-03-13 19:22:59
【问题描述】:

我想将条件格式(只是字体颜色)添加到组合框的文本框部分。根据 MSDN,它是“PART_EditableTextBox”元素。对 SO 的快速搜索让我开始了,但我现在面临一个问题:它覆盖了整个模板。根据this SO answer,我可以使用“BasedOn”来仅覆盖特定属性,但我不知道如何/在哪里使用它。 这是我当前的模板:

    <ControlTemplate x:Key="MyComboBoxTextBox" TargetType="ComboBox" <!--Here?--> >
        <TextBox x:Name="PART_EditableTextBox" <!--Maybe Here?-->>
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <Trigger Property="Text" Value="MAL">
                            <Setter Property="Foreground" Value="DarkOrange"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </ControlTemplate>

它有效,我仍然可以输入有效值,并且“MAL”确实使文本变为橙色,但不再有下拉菜单。 在 MSDN 上,我发现了以下内容:

<TextBox x:Name="PART_EditableTextBox"
               Style="{x:Null}"
               Template="{StaticResource ComboBoxTextBox}"
               HorizontalAlignment="Left"
               VerticalAlignment="Bottom"
               Margin="3,3,23,3"
               Focusable="True"
               Background="Transparent"
               Visibility="Hidden"
               IsReadOnly="{TemplateBinding IsReadOnly}" />

我想我的模板应该基于这个“ComboBoxTextBox”,但我不知道如何引用它。我真的需要复制整个模板还是有办法覆盖特定属性?

编辑: 在同一个 MSDN 页面上,comboboxTextBox 被定义为

<ControlTemplate x:Key="ComboBoxTextBox"
                 TargetType="{x:Type TextBox}">
       <Border x:Name="PART_ContentHost"
          Focusable="False"
          Background="{TemplateBinding Background}" />
</ControlTemplate>

我看不到覆盖此模板如何删除下拉列表。

【问题讨论】:

  • 在我看来,您的 ControlTemplate 所做的基本上是将您的 ComboxBox 重新模板化为只有一个 TextBox。如果您想查看下拉列表,您需要有该 PART 的控件定义!不幸的是,我在 ReTemplating 方面做得不够好,无法为您提供帮助,但希望这能为您指明正确的方向。

标签: wpf xaml combobox styling


【解决方案1】:

好吧,我想我在阅读了你所有的代码并且在工作中度过了非常漫长的一天后感到非常困惑,我完全错过了你问题的重点......这是

我想将条件格式(仅字体颜色)添加到组合框的文本框部分

好吧,如果这就是您想要做的,那么只需一个简单的样式触发器就可以轻松实现。 我可以用这个 xaml 来实现。

<ComboBox HorizontalAlignment="Center" VerticalAlignment="Center">
    <ComboBox.Resources>
        <Style TargetType="ComboBox">
            <Style.Triggers>
                <Trigger Property="Text" Value="MAL">
                    <Setter Property="Foreground" Value="DarkOrange" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Resources>
    <ComboBoxItem>MAL</ComboBoxItem>
    <ComboBoxItem>1</ComboBoxItem>
    <ComboBoxItem>2</ComboBoxItem>
    <ComboBoxItem>3</ComboBoxItem>
</ComboBox>

希望这会有所帮助!

【讨论】:

  • 我首先尝试了这种方式,但它也改变了整个下拉列表的前景色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多