在可编辑的ComboBox中设置闪烁光标的颜色

时间:2011-01-10 09:45:10

标签: c# wpf combobox

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

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

对可编辑的ComboBox执行相同操作时,不设置光标颜色。下面的代码将显示黑色(在这种情况下是不可见的)光标。

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

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

3 个答案:

答案 0 :(得分:6)

有一种方法可以通过重新模板化来改变插入符号的颜色。插入符号不是通过改变黑色和白色之间的颜色而闪烁,而是通过在背景颜色和背景颜色的XOR值之间改变颜色(更多信息部分here中的第一段更好地解释了窗口闪烁的作用插入符号)。这适用于本机文本框,应该适用于任何“自定义”编写的插入符号,以保持look'n'feel与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>

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

答案 1 :(得分:0)

另一种选择是在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. */}
}

接受的答案对我不起作用,我没有时间/专业知识来弄清楚原因,但这很好。

答案 2 :(得分:0)

来自:https://www.codeproject.com/Articles/633935/Customizing-the-Caret-of-a-WPF-TextBox 您只需设置CaretBrush MSDN

我在PART_EditableTextBox

的ComboBox模板中解决了该问题
<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}" />

当然,您可以省略多余的Brush资源。