C# 在可编辑组合框中设置闪烁光标的颜色

C# 在可编辑组合框中设置闪烁光标的颜色,c#,wpf,combobox,C#,Wpf,Combobox,设置文本框的前景和背景时,会自动设置闪烁光标的颜色。下面的代码将显示一个白色光标 <TextBox Background="Black" Foreground="White">Test</TextBox> 测试 对可编辑的组合框执行相同操作时,不会设置光标颜色。下面的代码将显示一个黑色(在本例中不可见)光标 测试1 测试2 那么,如何设置组合框的闪烁光标颜色呢?有一种方法可以通过重新放置文本框来更改插入符号的颜色。插入符号的闪烁不是通过在黑色和白色之间更改其颜色,

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

<TextBox Background="Black" Foreground="White">Test</TextBox>
测试
对可编辑的组合框执行相同操作时,不会设置光标颜色。下面的代码将显示一个黑色(在本例中不可见)光标


测试1
测试2

那么,如何设置组合框的闪烁光标颜色呢?

有一种方法可以通过重新放置文本框来更改插入符号的颜色。插入符号的闪烁不是通过在黑色和白色之间更改其颜色,而是通过在背景色和背景色的XOR值之间更改其颜色(更多信息部分的第一段更好地解释了windows如何闪烁插入符号)。这适用于本机文本框,并应适用于任何“自定义”书写插入符号,以使外观与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黄色(蓝色)之间闪烁,但黄色背景将永远不会被渲染(因为模板不关心背景色)。(上面的代码只是一个示例,说明了我的意思,它不包含普通文本框的所有视觉效果,但可以轻松添加这些内容)。

另一个选项是在文本框上使用相同的绑定

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. */}
}
被接受的答案对我不起作用,我没有时间/专业知识来找出原因,但这很有效。

来自: 您可以设置CaretBrush

我在ComboBox模板的
部分\u 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}" />


当然,您可以省略额外的笔刷资源。

KB链接。您完全正确,Windows通过与屏幕异或来计算插入点的值。我删除了与此相反的评论+1.
<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}" />