Могу ли я переадресовать событие IsMouseOver родственнику в XAML

Я хотел бы перенаправить событие IsMouseOver из одного элемента XAML одному из его братьев и сестер.
Я мог бы сделать это с помощью кода программной части, используя вызов RaiseEvent (...), но я бы не стал этого делать.
Можно ли привязать события IsMouseOver от одного брата к другому?

Например:
В приведенном ниже коде событие IsMouseOver для элемента BlueBorder изменяет границу с синего на зеленый.
Я бы хотел, чтобы BlueBorder также становился зеленым, когда указатель мыши находится над элементом RedBorder
(очевидно, я мог бы поместить триггер IsMouseOver в RedBorderStyle, но это не годится для моих реальных целей)

<Window.Resources>
    <Style x:Key="BlueBorderStyle" TargetType="{x:Type Border}">
        <Setter Property="Background" Value="Blue"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Green"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Background" Value="Blue"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="RedBorderStyle" TargetType="{x:Type Border}">
        <Setter Property="Background" Value="Red"/>
    </Style>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border x:Name="BlueBorder" Grid.Column="0" Style="{StaticResource BlueBorderStyle}"/>
    <Border x:Name="RedBorder" Grid.Row="1" Style="{StaticResource RedBorderStyle}"/>
</Grid>

(Or maybe I'm just approaching this in the wrong way?)

Вкратце:
У меня есть UserControl с заголовком вверху и ScrollView внизу. ScrollView написан таким образом, что когда курсор мыши находится над ScrollView, полосы прокрутки видны, а когда мышь уходит, полосы прокрутки исчезают. К сожалению, полосы прокрутки также исчезают, когда мышь переходит к заголовку, что мне не подходит.
Я мог бы охватить ScrollView, чтобы включить заголовок, но тогда область просмотра ScrollView также включает заголовок, и это тоже неправильно.

Есть предложения?


person kshill    schedule 22.06.2017    source источник
comment
IsMouseOver - это не событие. Это собственность. Однако триггеры стиля другого элемента управления могут быть привязаны к нему с помощью ElementName.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 23.06.2017
comment
›› IsMouseOver - это не событие. Это собственность. ‹BR› Верно. Хорошая точка зрения.   -  person kshill    schedule 23.06.2017


Ответы (1)


Вы можете попробовать запустить IsMouseOver контейнера (который является общим для обоих элементов). В этом примере это будет сетка.

<Window.Resources>
    <Style x:Key="BlueBorderStyle" TargetType="{x:Type Border}">
        <Setter Property="Background" Value="Blue"/>
        <Style.Triggers>
            <DataTrigger  Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type Grid}, AncestorLevel=1}}" Value="True">
                <Setter Property="Background" Value="Green"/>
            </DataTrigger>
            <DataTrigger  Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type Grid}, AncestorLevel=1}}" Value="False">
                <Setter Property="Background" Value="Blue"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="RedBorderStyle" TargetType="{x:Type Border}">
        <Style.Triggers>
            <DataTrigger  Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type Grid}, AncestorLevel=1}}" Value="True">
                <Setter Property="Background" Value="Purple"/>
            </DataTrigger>
            <DataTrigger  Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type Grid}, AncestorLevel=1}}" Value="False">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border x:Name="BlueBorder" Grid.Column="0" Style="{StaticResource BlueBorderStyle}"/>
    <Border x:Name="RedBorder" Grid.Row="1" Style="{StaticResource RedBorderStyle}"/>
</Grid>
person Tedy Pranolo    schedule 23.06.2017
comment
Вы заставили меня думать в правильном направлении. Спасибо. Как оказалось, мне просто нужно было изменить привязку в моем существующем DataTrigger, чтобы запускать сам объект Window ‹DataTrigger Binding = {Binding RelativeSource = {RelativeSource AncestorType = Window}, Path = IsMouseOver} Value = True› - person kshill; 23.06.2017