我为我的WPF应用程序创建了一个简单的按钮模板:
<Style x:Key="DialogButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="buttonBorder" CornerRadius="8" BorderThickness="2" BorderBrush="{TemplateBinding Background}" Background="{TemplateBinding Background}" MaxHeight="30" MinWidth="70" Margin="0,8,8,8">
<Grid>
<TextBlock Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="buttonBorder" Property="BorderBrush" Value="{DynamicResource WindowBackColor}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但是正如您在下面的屏幕截图中看到的那样,按钮在角落里有一个小的空白区域:
以下是按钮的放大部分:
我该如何解决这个问题?
谢谢!
答案 0 :(得分:10)
WPF默认情况下使用抗锯齿渲染元素,这可能会导致形状之间的间隙很小。
将EdgeMode
设置为Aliased
Border
这应该摆脱小差距
RenderOptions.EdgeMode="Aliased"
示例:
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border RenderOptions.EdgeMode="Aliased" Name="buttonBorder" CornerRadius="8" BorderThickness="2" BorderBrush="{TemplateBinding Background}" Background="{TemplateBinding Background}" MaxHeight="30" MinWidth="70" Margin="0,8,8,8">
<Grid>
<TextBlock Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="buttonBorder" Property="BorderBrush" Value="{DynamicResource WindowBackColor}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
结果:
之前(抗锯齿):之后(别名):
另一个简单的选择是将Grid
中的Style
更改为Border
并将Background
和CornerRadius
设置为相同但设置为{{ 1}}到-1,这将导致比使用Margin
更平滑的外观并删除小间隙
示例:
Aliased
答案 1 :(得分:3)
添加另一个悬停在现有顶部之上的边框最终可以实现所需的效果:
<Style x:Key="DialogButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Border Name="buttonBorder" CornerRadius="8" Background="{TemplateBinding Background}" MaxHeight="30" MinWidth="70" Margin="0,8,8,8">
<Grid>
<TextBlock Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</Border>
<Border Name="buttonHoverBorder" CornerRadius="8" BorderThickness="2" BorderBrush="{DynamicResource WindowBackColor}" Visibility="Hidden" Background="Transparent" MaxHeight="30" MinWidth="70" Margin="0,8,8,8"
Width="{Binding ElementName=buttonBorder, Path=Width}" Height="{Binding ElementName=buttonBorder, Path=Height}">
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="buttonHoverBorder" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 2 :(得分:2)
尝试将BorderThickness
buttonBorder
的{{1}}属性设置为Border
或更大的数字。话虽如此,我以前从未在"0"
个元素中看到过这个......你是否确实确定图像上的某些失真 em>按钮?
答案 3 :(得分:0)
我现在已经坚持了很长一段时间,定期遇到按钮样式的一些问题。上面的答案对我帮助很大,但所有这些都有一些缺陷。
因为我想创建自己的样式库以便在多个项目中使用,所以这些并不是很好的解决方案,即使它可以为每种风格做特别的工作。
嗯,现在看起来很简单,并告诉我,如果我错了,但模板根目录中的额外边框可以按预期完成工作。
位于其他元素下方,没有厚度,它应该具有模板背景颜色作为背景。从内边框给它大小属性,享受!
<Style x:Key="ButtonStyle2" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Background" Value="White"/>
<Setter Property="BorderBrush" Value="White"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="8" BorderThickness="0" Background="{TemplateBinding Background}" MaxHeight="30" MinWidth="70" Margin="0,8,8,8">
<Border Name="buttonBorder" CornerRadius="8" BorderThickness="2" BorderBrush="{TemplateBinding Background}" Background="{TemplateBinding Background}" >
<Grid>
<TextBlock Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</Border>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
link to the picture before/after, 4 kb
请注意,如果要通过“触发器”更改其他颜色,则必须在“触发器”中更改此边框的颜色。否则它将保持与静止状态相同,并且在按下/悬停时将在间隙中可见。