Установка цвета мигающего курсора в редактируемом ComboBox - PullRequest
4 голосов
/ 10 января 2011

При установке переднего плана и фона TextBox цвет мигающего курсора устанавливается автоматически.Код ниже покажет белый курсор.

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

При выполнении того же действия для редактируемого ComboBox цвет курсора не устанавливается.Код ниже покажет черный (в данном случае невидимый) курсор.

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

Итак, как мне установить мигающий цвет курсора ComboBox?

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Существует способ изменить цвет каретки путем повторного добавления текстового поля.Каретка мигает не путем изменения ее цвета между черным и белым, а путем изменения ее цвета между цветом фона и значением XOR цвета фона (первый абзац в разделе «Подробнее» здесь лучше объясняет, что делает окноморгать кареткой).Это относится к собственному текстовому полю и должно применяться к любой «пользовательской» письменной каретке, чтобы обеспечить соответствие стиля 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>

Таким образом, вы устанавливаете цвет фона (желтый), каретка будет мигать между этим цветом и XOR желтым (синим), но желтый фон никогда не будет отображаться(потому что шаблон не заботится о цвете фона).(приведенный выше код является лишь примером, показывающим, что я имею в виду, он не содержит всех визуальных элементов обычного текстового поля, но их можно легко добавить).

0 голосов
/ 29 января 2017

Другой вариант - использовать ту же привязку в 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. */}
}

Принятый ответ мне не помог, и мне не хватает времени / опыта, чтобы выяснить, почему, но это работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...