Проблема с использованием триггеров в XAML - PullRequest
3 голосов
/ 18 июля 2011

В приведенном ниже коде, когда мышь находится над сеткой, Background сетки, как ожидается, будет красным, но не выполняется должным образом.

<Grid>
    <Grid.Style>
    <Style TargetType="{x:Type Grid}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red"/>
            </Trigger>
        </Style.Triggers>
        </Style>
    </Grid.Style>
</Grid>

Однако, если я добавлюSetter, чтобы сделать Background зеленым, он будет выполнен правильно.

<Grid>
    <Grid.Style>
    <Style TargetType="{x:Type Grid}">
        <Setter Property="Background" Value="Green"/><!-- at the former, added code-->
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red"/>
            </Trigger>
        </Style.Triggers>
        </Style>
    </Grid.Style>
</Grid>

Я не знаю, почему это так, но думаю, что есть приоритет для установки Background,вызывая проблему.Вот Значение свойства зависимости Приоритет из MSDN, и я понимаю приоритет этой ссылки, но я не могу связать эту проблему с приоритетом (MSDN).

Кроме того, в приведенном выше кодефрагменты, если Grid заменен на Button, оба эти кода не будут выполнены должным образом.


ОБНОВЛЕНО: добавлен регистр кнопки об этой проблеме

<Button>
    <Button.Style >
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background"  Value="Transparent"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

1 Ответ

3 голосов
/ 18 июля 2011

Проблема в том, что ваша сетка имеет нулевой фон, поэтому она не видна при тестировании мыши. Если для фона задано значение «Прозрачный», он будет проверяться на попадание, как если бы вы установили его на зеленый.

Более подробную информацию можно найти здесь .

Я попробовал вашу кнопку, и фон был правильно настроен на прозрачный. Значение красного отображается только за долю секунды. Это связано с тем, что в теме Aero (я на Windows 7) ControlTemplate Button использует собственный хром для обеспечения анимированных переходов состояний (т. Е. При наведении курсора и т. Д.). Этот пользовательский элемент chrome использует внутренние кисти и игнорирует свойство Background.

Это не имеет ничего общего с приоритетом свойства. Для Сетки, это просто вопрос того, что ваша Сетка не проверяется на попадание. Поэтому IsMouseOver не будет иметь значение true, если только у него нет ненулевого фона (или дочернего элемента, который отображает что-либо).

Вы можете увидеть Приоритет в действии здесь:

<Grid Background="Blue">
    <Grid.Style>
        <Style TargetType="{x:Type Grid}">
             <Setter Property="Background" Value="Green"/>
             <Style.Triggers>
                  <Trigger Property="IsMouseOver" Value="True">
                       <Setter Property="Background" Value="Red"/>
                  </Trigger>
              </Style.Triggers>
        </Style>
    </Grid.Style>
</Grid>

В приведенном выше описании Сетка всегда будет синей, так как она имеет наивысший приоритет (то есть локальная или № 3). В то время как красный (# 6) имеет приоритет над зеленым (# 8).

В случае с кнопкой у вас есть что-то вроде этого:

<Button Background="Blue">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="Button">
                         <Border x:Name="border" Background="{TemplateBinding Background}">
                             <ContentPresenter />
                         </Border >
                         <ControlTemplate.Triggers>
                             <Trigger Property="IsMouseOver" Value="True">
                                 <Setter TargetName="border" Property="Background" Value="Red"/>
                             </Trigger>
                         </ControlTemplate.Triggers>
                     </ControlTemplate>
                 </Setter.Value>
              </Setter>
        </Style>
    </Button.Style>
</Button>

В этом случае в игре есть два свойства фона: кнопка и граница в шаблоне элемента управления. Свойство Background для кнопки используется по умолчанию для Border, но при наведении курсора мыши используется красная кисть. В этот момент не имеет значения, какое значение свойства Background у кнопки установлено.

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