带有形状模板的按钮:设置背景时不会触发单击事件
Button with Shape Template: click event not fired when background is set
我在遵循基于形状的控制模板时遇到问题:
<ControlTemplate x:Key="EllipseButton" TargetType="{x:Type Button}">
<Grid>
<Ellipse Fill="{TemplateBinding Background}" />
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="Navy" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
问题是,当按钮的 背景 属性 已设置 时,按钮 不会生成点击事件 (请参阅 Background="White"
).如果未设置背景,则会触发点击事件。
<Button x:Name="Button"
Content="Click"
VerticalAlignment="Top" HorizontalAlignment="Left"
Template="{StaticResource EllipseButton}"
Background="White" <-- PROBLEMATIC PROPERTY
/>
如何在不丢失点击事件的情况下安全地将 Button.Background 属性 绑定到 Elipse.Fill 属性?
您创建的按钮有误。如果您将背景设置为白色,并且没有在其他地方定义 Ellipse 绑定的模板绑定,则 WPF 不会对您的自定义按钮进行点击测试。请检查 TemplateBinding 绑定,它不正确。
我知道问题出在哪里了。我 在触发器部分 中错误地设置了背景。我应该设置椭圆的填充 属性,而不是将背景设置为按钮:
...
<Ellipse Name="Ellipse" Fill="{TemplateBinding Background}" />
...
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Ellipse" Property="Fill" Value="Navy" />
</Trigger>
...
我在遵循基于形状的控制模板时遇到问题:
<ControlTemplate x:Key="EllipseButton" TargetType="{x:Type Button}">
<Grid>
<Ellipse Fill="{TemplateBinding Background}" />
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="Navy" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
问题是,当按钮的 背景 属性 已设置 时,按钮 不会生成点击事件 (请参阅 Background="White"
).如果未设置背景,则会触发点击事件。
<Button x:Name="Button"
Content="Click"
VerticalAlignment="Top" HorizontalAlignment="Left"
Template="{StaticResource EllipseButton}"
Background="White" <-- PROBLEMATIC PROPERTY
/>
如何在不丢失点击事件的情况下安全地将 Button.Background 属性 绑定到 Elipse.Fill 属性?
您创建的按钮有误。如果您将背景设置为白色,并且没有在其他地方定义 Ellipse 绑定的模板绑定,则 WPF 不会对您的自定义按钮进行点击测试。请检查 TemplateBinding 绑定,它不正确。
我知道问题出在哪里了。我 在触发器部分 中错误地设置了背景。我应该设置椭圆的填充 属性,而不是将背景设置为按钮:
...
<Ellipse Name="Ellipse" Fill="{TemplateBinding Background}" />
...
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Ellipse" Property="Fill" Value="Navy" />
</Trigger>
...