Почему мое Textbox не реагирует на IsMouseOver в стиле для ControlTemplate - PullRequest
0 голосов
/ 05 ноября 2018

Поэтому я пытаюсь немного стилизовать свой TextBox, идея заключалась в том, что я хотел стилизовать BorderBrush при наведении курсора на TextBox, но по какой-то причине он не изменил Border, поэтому я также попытался изменить Background, и там тоже самое Вот тогда я понял, что он не реагирует на IsMouseOver, но он устанавливает фон и все остальное, что я сделал, это просто событие IsMouseOver, на которое оно не реагирует.

Контроль

<TextBox Width="700"
         Height="340"
         HorizontalAlignment="Right"
         Margin="0,0,230,140"
         Foreground="#8bf502"
         TextWrapping="Wrap"
         Style="{DynamicResource TextboxStyle}"/>

Стиль

<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
    <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Background="#424242">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Orange"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вам не хватает TargetName и BorderThickness:

<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
    <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Name="border" BorderThickness="2" Background="#424242">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="border" Property="BorderBrush" Value="Orange"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Нет Border, если вы не установите для свойства BorderThickness значение, отличное от 0.

0 голосов
/ 05 ноября 2018

Вы используете пользовательский Template, но ваш шаблон не применяет свойства границ шаблонного TextBox. Попробуйте добавить следующее к элементу Border в шаблоне:

BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"

На самом деле есть несколько способов подойти к этому: использовать привязки шаблонов и поставить триггер в Style; используйте привязки к шаблону и вставьте триггер в шаблон; используйте явный целевой элемент и поместите триггер в шаблон (как предлагали другие); и т. д. «Правильный» подход зависит от того, как / если вы хотите, чтобы элемент управления реагировал на изменение свойства. Например: если кто-то устанавливает новый BorderBrush непосредственно на TextBox, хотите ли вы, чтобы он заменил ваш эффект оранжевого наведения или нет? Стоит прочитать значение приоритета свойств зависимостей, чтобы понять последствия того, как и где установлены определенные свойства.

Стоит отметить, что ваш шаблон неполон и не будет работать, если вы хотите, чтобы текст был редактируемым (или выбираемым). TextBox ожидает, что его шаблон будет иметь специальное имя ScrollViewer, в которое может быть введено редактируемое текстовое представление. Попробуйте заменить ContentPresenter на следующее:

<ScrollViewer x:Name="PART_ContentHost"
              Padding="{TemplateBinding Padding}" />

Обратите внимание, что атрибут x:Name должен точно совпадать.

0 голосов
/ 05 ноября 2018

Чтобы изменить фон границы, присвойте границе имя и добавьте TargetName = "MyBorder" в сеттер

...