c# - isMouseOver 在带有路径的 Canvas 中

标签 c# wpf

抱歉我的英语不好。 我是 WPF 新手,我有一个问题。 我想在触发 isMouseOver 时更改包含路径(图像)的 Canvas 的视觉样式。

步骤:

  • 将 Canvas 放置到窗口
  • 包含路径

结果:

<Canvas x:Name="mycanvas" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
         <Path Width="40" Height="30" Canvas.Left="18" Canvas.Top="23" Stretch="Fill" Fill="#FF000000" Data="F1 M 18,23L 58,23L 58,53L 18,53L 18,23 Z M 54,31L 22,31L 22,49L 54,49L 54,31 Z M 45,38L 45,42L 31,42L 31,38L 45,38 Z "/>
    </Canvas>

然后,我将 Canvas 与 Button 样式组合在一起,并在发生 isMouseOver 时用白色填充“Path”。

我的风格:

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Button}">
    <Canvas x:Name="mycanvas" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
        <Path x:Name="path" Width="40" Canvas.Top="23" Stretch="Fill" Canvas.Left="18" Height="30" Fill="#FF000000" Data="F1 M 18,23L 58,23L 58,53L 18,53L 18,23 Z M 54,31L 22,31L 22,49L 54,49L 54,31 Z M 45,38L 45,42L 31,42L 31,38L 45,38 Z "/>
        </Canvas>
    <ControlTemplate.Triggers>
    <Trigger Property="IsFocused" Value="True"/>
    <Trigger Property="IsDefaulted" Value="True"/>
    <Trigger Property="IsMouseOver" Value="True" SourceName="mycanvas">
        <Setter Property="Fill" TargetName="path" Value="White"/>
    </Trigger>
    <Trigger Property="IsPressed" Value="True"/>
        <Trigger Property="IsEnabled" Value="False"/>
    </ControlTemplate.Triggers>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
</Style>

但是 IsMouseOver 仅当鼠标穿过图像(“路径”)表面时才起作用。 但图像表面较小且包含断点。 我该如何解决这个问题?

最佳答案

Canvas背景中放置一个SolidColorBrushTransparent >颜色:

 <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Canvas x:Name="mycanvas" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
                        <Canvas.Background>
                            <SolidColorBrush Color="Transparent"/>
                        </Canvas.Background>
                        <Path x:Name="path" Width="40" Canvas.Top="23" Stretch="Fill" Canvas.Left="18" Height="30" Fill="#FF000000" Data="F1 M 18,23L 58,23L 58,53L 18,53L 18,23 Z M 54,31L 22,31L 22,49L 54,49L 54,31 Z M 45,38L 45,42L 31,42L 31,38L 45,38 Z "/>
                    </Canvas>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True" SourceName="mycanvas">
                            <Setter Property="Fill" TargetName="path" Value="White"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

关于c# - isMouseOver 在带有路径的 Canvas 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17531751/

相关文章:

c# - 全局资源未将样式应用于 xaml 中的控件

c# - 线程无法访问对象

.net - ICommand 如何以及在何处融入整个 WPF MVVM 模式?

c# - 无法将可检查的 MenuItem 绑定(bind)到父窗口的 Topmost (始终位于顶部)属性

c# - 在父/接口(interface)中使用子类型

c# - ASP.NET 真正的异步操作

c# - npoco.Insert<T> 在带有 OUT AutoIncrement 主键的表上失败

c# - 在没有 PKCS11 的情况下使用 HSM 的 .NET 中的密码学

c# - 如何利用 MVVM Light EventToCommand 在 XAML 中绑定(bind)大量相同的事件?

c# - 将自定义对象绑定(bind)到 DataGrid