我使用BorderThickness = 2创建了一个自定义复选框按钮。 我想在选中时将边框的颜色更改为蓝色。
问题是边框和图标之间有非常细的黑线让我烦恼。有什么办法可以删除吗?
下面是我的按钮样式字典的部分代码。
<Style x:Key="ExampleButton" TargetType="{x:Type CheckBox}">
<Setter Property="Width" Value="40" />
<Setter Property="Height" Value="40" />
<Setter Property="Background" Value="{StaticResource BrushDarkGray11}" />
<Setter Property="BorderBrush" Value="{StaticResource BrushDarkGray11}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Border x:Name="Grid" Background="{TemplateBinding Background}"
CornerRadius="2" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2">
<ContentPresenter x:Name="Content" Content="{TemplateBinding Content}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Grid" Property="BorderBrush" Value="{StaticResource BrushBlue1}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 0 :(得分:2)
似乎是某种渲染工件来自WPF渲染带有抗锯齿边缘的边框。
我能够(大部分)在我的测试代码中摆脱它,告诉WPF通过向样式添加<Setter Property="SnapsToDevicePixels" Value="True" />
来渲染与屏幕像素对齐的行(当我进行任何类型的桌面开发时,我总是无论如何,在Window
上设置它,因为我认为它使WPF看起来更干净)。这看起来更好,但在每个角落留下了不同颜色的小像素,很可能是圆角。
接下来,我尝试嵌套边框,如下所示:
<ControlTemplate TargetType="{x:Type CheckBox}">
<Border
x:Name="Grid"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="2"
CornerRadius="2">
<Border Background="{TemplateBinding Background}">
<ContentPresenter
x:Name="Content"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Grid" Property="BorderBrush" Value="{StaticResource BrushBlue1}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
这似乎完全解决了我。
我注意到这掩盖了内角半径。我更喜欢这种效果,但是如果它对你的项目来说是一个问题,你可以使用Grid
覆盖边框,这样圆形的边框就会显示在顶部。确保四舍五入的Border
具有透明Background
。您还需要将背景Margin
上的Border
设置为与BorderThickness
相同的值,否则此背景将通过Border
的外角渗出圆角。
<ControlTemplate TargetType="{x:Type CheckBox}">
<Grid>
<Border Margin="2" Background="{TemplateBinding Background}">
<ContentPresenter
x:Name="Content"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Border>
<Border
x:Name="Grid"
Background="Transparent"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="2"
CornerRadius="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Grid"
Property="BorderBrush"
Value="{StaticResource BrushBlue1}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>