我可以将 IsMouseOver 事件转发给 XAML 中的兄弟姐妹吗
Can I Forward IsMouseOver event to a sibling in XAML
我想将 IsMouseOver 事件从一个 XAML 元素转发到它的兄弟姐妹之一。
我也许可以通过 code-behind 使用 RaiseEvent(...) 调用来完成此操作,但我宁愿不这样做。
是否可以将 IsMouseOver 事件从一个兄弟绑定到另一个兄弟?
例如:
在下面的代码中,BlueBorder 元素的 IsMouseOver 事件将边框从蓝色变为绿色。
当鼠标悬停在 RedBorder 元素上时,我也希望 BlueBorder 变为绿色
(显然,我可以在 RedBorderStyle 中放置一个 IsMouseOver 触发器,但这不符合我的 real-world 目的)
<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>
(或者也许我只是以错误的方式接近这个?)
一些背景知识:
我有一个 UserControl,上面有一个 header,下面有一个 ScrollView。 ScrollView 是这样写的,当鼠标在 ScrollView 上时,ScrollBars 是可见的,当鼠标离开时,滚动条消失。不幸的是,当鼠标移动到 header 时,滚动条也会消失,这不是我想要的。
我可以跨越 ScrollView 以包含 header,但 ScrollView 的视口也包含 header,这也不对。
建议?
您可以尝试触发容器的 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>
我想将 IsMouseOver 事件从一个 XAML 元素转发到它的兄弟姐妹之一。
我也许可以通过 code-behind 使用 RaiseEvent(...) 调用来完成此操作,但我宁愿不这样做。
是否可以将 IsMouseOver 事件从一个兄弟绑定到另一个兄弟?
例如:
在下面的代码中,BlueBorder 元素的 IsMouseOver 事件将边框从蓝色变为绿色。
当鼠标悬停在 RedBorder 元素上时,我也希望 BlueBorder 变为绿色
(显然,我可以在 RedBorderStyle 中放置一个 IsMouseOver 触发器,但这不符合我的 real-world 目的)
<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>
(或者也许我只是以错误的方式接近这个?)
一些背景知识:
我有一个 UserControl,上面有一个 header,下面有一个 ScrollView。 ScrollView 是这样写的,当鼠标在 ScrollView 上时,ScrollBars 是可见的,当鼠标离开时,滚动条消失。不幸的是,当鼠标移动到 header 时,滚动条也会消失,这不是我想要的。
我可以跨越 ScrollView 以包含 header,但 ScrollView 的视口也包含 header,这也不对。
建议?
您可以尝试触发容器的 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>