Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的按钮以奇怪的方式与isMouseOver一起工作_C#_.net_Wpf_Visual Studio - Fatal编程技术网

C# 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

我有一个有趣的问题在这里与WPF和按钮样式。问题是,它包含一个路径,而isMouseOver似乎只在鼠标指针位于路径上方而不是按钮上方时触发。也就是说,我必须将鼠标指针移动到按钮内部的白色图形上,以使按钮着色。好像按钮不存在,只有路径存在

这是按钮的代码:

<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
?过去在这个问题上帮助我的还有设置背景,即使它是透明的。谢谢。我添加了属性,什么都没有。这很奇怪,因为一旦我点击路径并将鼠标移出,但指针仍在按钮上方,它保持阴影,只有在我将指针移到按钮外部后才恢复正常。你是如何设置背景的?我会调查的,我加了这个什么都没有。就像按钮会出现一样。即使双击按钮的区域也会使窗口最大化,就像单击任务栏一样。鼠标悬停后,指针会使按钮出现,并一直保持这种状态,直到我将其移出。好吧,似乎我误解了背景部分,我正确地理解了对方回答时的意思。再次感谢,成功了!谢谢你的回答。“我现在真的能理解了,因为你解释得更好了。”沃尔多阿尔瓦雷斯:没问题。