1

我正在使用路径绘制三角形,并且IsMouseOver仅当鼠标指针位于三角形上方时该属性才为真。当指针位于路径背景(透明)上时,我也希望它为 True。我怎样才能得到这个结果?

<!-- language: lang-xml -->
<Style TargetType="{x:Type Path}">
    <Setter Property="Stretch" Value="Uniform"/>
    <Setter Property="Fill" Value="#FF9C9C9C"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Fill" Value="#FFBDBDBD"/>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12" Color="#FF9C9C9C" ShadowDepth="0"/>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

<Path Margin="6,0,0,0" StrokeThickness="0" Width="35" Height="17" Data="M0,0 L8,5, 0,10 Z"/>
4

3 回答 3

2

一种方法是在路径周围放置一个边框,然后绑定到边框的 IsMouseOver 属性而不是路径的属性。为此,必须将边框的背景显式设置为“透明”(或您喜欢的任何颜色)。

在路径周围放置边框:

<Border x:Name="Border" Background="Transparent" Margin="6,0,0,0" Width="17" Height="17">
    <Path StrokeThickness="0" Data="M0,0 L8,5, 0,10 Z"/>
</Border>

然后绑定到边框的 IsMouseOver 属性而不是路径的:

<DataTrigger Binding="{Binding IsMouseOver, ElementName=Border}" Value="True">
于 2014-06-09T14:43:01.843 回答
0

由于路径是一种形状,所以绘制的形状是触发鼠标移动的区域,所有其他事件都传递给下面的控件

我试图用不同的方法来达到同样的效果

风格

    <Style TargetType="{x:Type ContentControl}" x:Key="icon">
        <Setter Property="Background" Value="#FF9C9C9C"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="Template" >
            <Setter.Value>
                <ControlTemplate TargetType="ContentControl">
                    <Border Background="Transparent">
                        <Path Stretch="Uniform" Fill="{TemplateBinding Background}" Margin="6,0,0,0" StrokeThickness="0" Data="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="#FFBDBDBD"/>
                <Setter Property="Effect">
                    <Setter.Value>
                        <DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12" Color="#FF9C9C9C" ShadowDepth="0"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

用法

    <ContentControl Style="{StaticResource icon}" Width="35" Height="17" Content="M0,0 L8,5, 0,10 Z"/>

在上面的样式中,我添加了一个具有透明背景的边框,它有效地为鼠标事件创建了一个透明区域,因此将能够捕获鼠标移动完全控制

于 2014-06-09T14:47:40.783 回答
0

也许你没有问正确的问题?您展示了您的代码(效果很好)并说

当指针在路径的背景上时,我也希望 [IsMouseOver属性为] True

IsMouseOver属性 true当您将鼠标Background放在Path. 但是,您的标题说

为整个控件而不是在 DrawingData 上设置 IsMouseOver 属性

这当然是非常不同的事情(并且是在发布之前阅读您的问题的充分理由)。如果您想在Path.Effect将鼠标放在整个控件上时进行更改,那么您只需编写一个Style访问该控件的 a 即可。同样,您没有让我们知道该控件可能是什么类型,所以我假设它是一个Window. 尝试这个:

<Style TargetType="{x:Type Path}">
    <Setter Property="Stretch" Value="Uniform"/>
    <Setter Property="Fill" Value="#FF9C9C9C"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource 
            AncestorType={x:Type Window}}}" Value="True">
            <Setter Property="Fill" Value="#FFBDBDBD"/>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12" 
                        Color="#FF9C9C9C" ShadowDepth="0"/>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

如果那仍然不是您所追求的,那么也许更具体地说明您想要什么是一个想法。


更新>>>

既然您已经解释了 thePath位于 a 中Button,我可以建议您简单地添加 aStyleButton更改Cursor

<Style TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand" />
        </Trigger>
    </Style.Triggers>
</Style>
于 2014-06-09T14:46:42.813 回答