WPF中MaterialDesign PackIcon获焦时修改边框颜色的实现问题
正确实现方法
先明确核心问题:PackIcon作为Button的子元素,默认不会获得焦点,焦点始终在父级Button上;同时你之前的方案存在拼写错误,导致XAML无法正常编译或生效。以下是两种可行的实现方案:
方案一:绑定按钮焦点状态,给PackIcon套动态边框
无需修改按钮模板,给PackIcon包裹Border,通过绑定父按钮的IsFocused属性控制边框样式:
<Button x:Name="addBugBtn" Margin="10 5" Command="{Binding AddBugCommand}" ToolTip="Add" Style="{StaticResource MaterialDesignIconButton}"> <Border BorderThickness="0" BorderBrush="Transparent"> <MaterialDesign:PackIcon Kind="BugOutline"/> <Border.Style> <Style TargetType="Border"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=addBugBtn, Path=IsFocused}" Value="True"> <Setter Property="BorderThickness" Value="2"/> <Setter Property="BorderBrush" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> </Border> </Button>
方案二:修改按钮模板,通过触发器统一控制边框
如果希望按钮焦点时的边框样式和原按钮视觉状态整合,可以重写按钮模板:
<Button Margin="10 5" Command="{Binding AddBugCommand}" ToolTip="Add"> <Button.Style> <Style TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignIconButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border x:Name="btnBorder" BorderThickness="0" BorderBrush="Transparent" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </Border> <ControlTemplate.Triggers> <!-- 焦点状态下显示黄色边框 --> <Trigger Property="IsFocused" Value="True"> <Setter TargetName="btnBorder" Property="BorderThickness" Value="2"/> <Setter TargetName="btnBorder" Property="BorderBrush" Value="Yellow"/> </Trigger> <!-- 保留原按钮的鼠标悬停、按下状态 --> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="btnBorder" Property="Background" Value="{StaticResource MaterialDesignRaisedButtonMouseOverBackground}"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="btnBorder" Property="Background" Value="{StaticResource MaterialDesignRaisedButtonPressedBackground}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Button.Style> <MaterialDesign:PackIcon Kind="BugOutline"/> </Button>
你之前方案的错误说明
- 方案一:存在多处拼写错误(
Triggers应为单数Trigger、Style.Trigers应为Style.Triggers、Propety应为Property、Value=""Yellow"多了一个引号),且PackIcon默认无法获得焦点,即便修正错误也无法触发。 - 方案二:未正确闭合
Trigger标签,且MaterialDesignIconButton的默认模板可能覆盖了BorderBrush属性,直接设置无法生效。
内容的提问来源于stack exchange,提问作者mukul nagpal
相关产品推荐
相关产品推荐

