C# WPF中的按钮以奇怪的方式与isMouseOver一起工作
我有一个有趣的问题在这里与WPF和按钮样式。问题是,它包含一个路径,而isMouseOver似乎只在鼠标指针位于路径上方而不是按钮上方时触发。也就是说,我必须将鼠标指针移动到按钮内部的白色图形上,以使按钮着色。好像按钮不存在,只有路径存在 这是按钮的代码:C# WPF中的按钮以奇怪的方式与isMouseOver一起工作,c#,.net,wpf,visual-studio,C#,.net,Wpf,Visual Studio,我有一个有趣的问题在这里与WPF和按钮样式。问题是,它包含一个路径,而isMouseOver似乎只在鼠标指针位于路径上方而不是按钮上方时触发。也就是说,我必须将鼠标指针移动到按钮内部的白色图形上,以使按钮着色。好像按钮不存在,只有路径存在 这是按钮的代码: <Button Grid.Column="5" x:Name="btnClose" Width="30" Height="30" BorderBrush="White" BorderThickness="0" Style
<Button Grid.Column="5" x:Name="btnClose" Width="30" Height="30" BorderBrush="White"
BorderThickness="0" Style="{StaticResource MenuButtonStyle}"
Command="{Binding ExitCommand}">
<Path Data="M0,0 L16,16 M16,0 L0,16" Stroke="White" StrokeThickness="3"
Margin="0,1,0,0" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />
</Button>
这就是风格:
<Style x:Key="MenuButtonStyle" TargetType="Button">
<Setter Property="Width" Value="80" />
<Setter Property="Height" Value="80" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="FontSize" Value="13.5"/>
<Setter Property="Foreground" Value="Red"/>
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="2.5"
x:Name="ButtonBorder"
BorderThickness="1.2"
RenderTransformOrigin="0.5,0.5">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0">
<Border x:Name="ButtonShine" Grid.Row="0" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" >
<!--<Border.Effect>
<DropShadowEffect ShadowDepth="1" BlurRadius="1" RenderingBias="Quality" Direction="270" />
</Border.Effect>-->
</Border>
<ContentPresenter Grid.Row="0" VerticalAlignment="Center"
HorizontalAlignment="Center" />
<Border x:Name="shadowMouseOver" Grid.Row="0" Visibility="Hidden"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Background="#7F171717">
</Border>
<Border x:Name="shadowDisabled" Grid.Row="0" Visibility="Hidden"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Background="#AFFFFFFF">
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsEnabled" Value="false">
<Setter Property="Button.Foreground" Value="#FFDEDEDE" />
<Setter Property="Visibility" TargetName="shadowDisabled" Value="Visible"/>
</Trigger>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property="Visibility" TargetName="shadowMouseOver" Value="Visible"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property="Button.RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="Button.RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="0.95" ScaleY="0.95"/>
</Setter.Value>
</Setter>
<Setter Property="Visibility" TargetName="shadowMouseOver" Value="Visible"/>
<Setter Property="Background" TargetName="ButtonShine" >
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFBFBFBF" Offset="1"/>
<GradientStop Color="#FF383838"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" TargetName="ButtonShine" >
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFBFBFBF" Offset="1"/>
<GradientStop Color="#FF383838"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
有什么想法吗?WPF中的Bug?某些操作不正确?这肯定不是一个bug,但由于您在默认状态的模板中没有为控件提供背景;因此,命中测试在路径之外的区域失败。如果您注意到,
shadowMouseOver
和shadowDisabled
这两个仅提供任何背景的边框都不可见,除非触发相应的事件。因此,它们对命中测试不可见。另一方面,你的路径是可见的,因此它能够触发事件
有关更多信息,请参见MSDN:
为了防止将来某个时候链接失败,这里有一个部分大致总结了我在这里要说的内容:
VisualTreeHelper类中HitTest方法的目的是
确定几何图形或点坐标值是否在
给定对象的渲染内容,如控件或图形
元素。例如,您可以使用命中测试来确定
在对象的边界矩形内单击鼠标将落在
圆的几何形状。也可以选择覆盖默认值
实现命中测试以执行您自己的自定义命中测试
计算。下图显示了这种关系
在非矩形对象的区域和其边界矩形之间
如果希望保持透明的背景外观,您有几个选项。由于hits测试可以看到透明对象,因此可以将该背景设置为透明,或者将其设置为某种颜色,同时将其不透明度降低为0。该背景的最佳位置可能是
按钮顺序
(最外边框),但这将由您决定。无法尝试,但您是否已选中将按钮的IshitteVisible
设置为true
?过去在这个问题上帮助我的还有设置背景,即使它是透明的。谢谢。我添加了属性,什么都没有。这很奇怪,因为一旦我点击路径并将鼠标移出,但指针仍在按钮上方,它保持阴影,只有在我将指针移到按钮外部后才恢复正常。你是如何设置背景的?我会调查的,我加了这个什么都没有。就像按钮会出现一样。即使双击按钮的区域也会使窗口最大化,就像单击任务栏一样。鼠标悬停后,指针会使按钮出现,并一直保持这种状态,直到我将其移出。好吧,似乎我误解了背景部分,我正确地理解了对方回答时的意思。再次感谢,成功了!谢谢你的回答。“我现在真的能理解了,因为你解释得更好了。”沃尔多阿尔瓦雷斯:没问题。