【问题标题】:Setting color of blinking cursor in editable ComboBox在可编辑的 ComboBox 中设置闪烁光标的颜色
【发布时间】:2011-06-06 10:26:39
【问题描述】:

在设置 TextBox 的前景和背景时,会自动设置闪烁光标的颜色。下面的代码将显示一个白色光标。

<TextBox Background="Black" Foreground="White">Test</TextBox>

当对一个可编辑的 ComboBox 做同样的事情时,光标颜色没有被设置。下面的代码将显示一个黑色(在这种情况下不可见)光标。

<ComboBox Background="Black" Foreground="White" IsEditable="True">
  <ComboBoxItem>Test1</ComboBoxItem>
  <ComboBoxItem>Test2</ComboBoxItem>
</ComboBox>

那么,如何设置 ComboBox 的闪烁光标颜色?

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    发件人:https://www.codeproject.com/Articles/633935/Customizing-the-Caret-of-a-WPF-TextBox 你可以设置 CaretBrush MSDN

    我在我的 ComboBox 模板中修复了这个问题,在 PART_EditableTextBox

    <SolidColorBrush x:Key="DefaultTextBrush" Color="Pink"/>
    <TextBox x:Name="PART_EditableTextBox" 
    HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
    IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}" 
    Margin="{TemplateBinding Padding}" Style="{StaticResource ComboBoxEditableTextBox}" 
    VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
    Foreground="{DynamicResource DefaultTextBrush}" 
    CaretBrush="{DynamicResource DefaultTextBrush}" />
    

    当然,你可以省略额外的画笔资源。

    【讨论】:

      【解决方案2】:

      另一种选择是在 TextBox 上使用相同的绑定。

      public override void OnApplyTemplate()
      {
          try
          {
              base.OnApplyTemplate();
              myCombo.ApplyTemplate();
              TextBox tb = myCombo.Template.FindName("PART_EditableTextBox", myCombo) as TextBox;
              if (tb != null)
              {
                  tb.SetBinding(TextBox.BackgroundProperty, myCombo.GetBindingExpression(ComboBox.BackgroundProperty).ParentBindingBase);
              }
              else
              {
                  /* etc. */
              }
          }
          catch (Exception) { /* etc. */}
      }
      

      接受的答案对我不起作用,我缺乏时间/专业知识来找出原因,但这很好。

      【讨论】:

        【解决方案3】:

        有一种方法可以通过重新模板化文本框来更改插入符号的颜色。插入符号的闪烁不是通过在黑色和白色之间改变其颜色,而是通过在背景颜色和背景颜色的 XOR 值之间改变其颜色(更多信息部分的第一段here 更好地解释了窗口如何使插入符号闪烁)。这适用于本机文本框,并且应适用于任何“自定义”书写插入符号,以保持外观与 Windows 标准一致。

        对于 WPF,有一个小的解决方法可以改变插入符号的颜色:

        <TextBox Background="Yellow">
            <TextBox.Template>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border x:Name="Border">
                        <ScrollViewer Margin="0" x:Name="PART_ContentHost" Style="{DynamicResource SimpleTextScrollViewer}" />
                    </Border>
                </ControlTemplate>
            </TextBox.Template>
        </TextBox>
        

        这样你设置了背景颜色(黄色),插入符号会在这个颜色和XOR黄色(蓝色)之间闪烁,但是永远不会渲染黄色背景(因为模板不关心背景颜色)。 (上面的代码只是一个例子来说明我的意思,它不包含普通文本框的所有视觉效果,但可以轻松添加)。

        【讨论】:

        • 引人入胜的知识库链接。您完全正确,Windows 通过与屏幕进行异或运算来计算插入点的值。相反,我删除了我的评论。 +1
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        相关资源
        最近更新 更多