gpt4 book ai didi

wpf - 在 XAML 中使用触发器的问题

转载 作者:行者123 更新时间:2023-12-01 15:35:14 25 4
gpt4 key购买 nike

在下面的代码中,当鼠标悬停在网格上时,网格的背景 应该是红色的,但它并没有按预期执行。

<Grid>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>

但是,如果我添加 Setter 使 Background 变为绿色,它就会正确执行。

<Grid>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Setter Property="Background" Value="Green"/><!-- at the former, added code-->
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>

我不知道为什么会这样,但猜测是设置 Background 的优先级导致了这个问题。这是 Dependency Property Value Precedence来自 MSDN,我了解该引用文献的优先级,但我无法将此问题与优先级 (MSDN) 联系起来。

此外,在上面的代码片段中,如果 Grid 被替换为 Button,这两个代码都不会按预期执行。


更新:添加关于此问题的按钮案例

<Button>
<Button.Style >
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>

最佳答案

问题是您的 Grid 背景为空,因此对于鼠标点击测试来说它是不可见的。如果将背景设置为透明,那么它将像设置为绿色时一样可以进行 HitTest 。

可以找到更多信息here .

我试过你的按钮,背景被正确地初始化为透明。红色值仅显示几分之一秒。这是因为在 Aero 主题中(我在 Windows 7 上),Button 的 ControlTemplate 使用自定义 chrome 来提供动画状态转换(即悬停时等)。此自定义 chrome 元素使用内部画笔并忽略 Background 属性。

这与属性优先级无关。对于 Grid,这只是您的 Grid 无法进行 HitTest 的问题。因此,它的 IsMouseOver 不会设置为 true,除非它具有非空背景(或呈现某些东西的 child )。

您可以在此处查看优先级:

<Grid Background="Blue">
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>

在上面,网格将始终为蓝色,因为它具有最高优先级(即本地或#3)。而红色 (#6) 优先于绿色 (#8)。

在 Button 的例子中,你有这样的东西:

<Button Background="Blue">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="border" Background="{TemplateBinding Background}">
<ContentPresenter />
</Border >
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>

在这种情况下,有两个背景属性在起作用:控件模板中的 Button 和 Border。 Border 默认使用 Button 的 Background 属性,但是当鼠标悬停时它使用红色画笔。此时,Button 的 Background 属性的值设置为什么都无关紧要。

关于wpf - 在 XAML 中使用触发器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6737998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com