Wpf 按钮模板无法清晰地渲染图像
这是我的按钮模板Wpf 按钮模板无法清晰地渲染图像,wpf,image,blurry,Wpf,Image,Blurry,这是我的按钮模板 <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" RenderMouseOver="{TemplateBin
<Microsoft_Windows_Themes:ButtonChrome
x:Name="Chrome"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
RenderDefaulted="{TemplateBinding IsDefaulted}"
RenderMouseOver="{TemplateBinding IsMouseOver}"
RenderPressed="{TemplateBinding IsPressed}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image
Source="{TemplateBinding ImageSource}"
RenderOptions.BitmapScalingMode="NearestNeighbor"
SnapsToDevicePixels="True"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Stretch="None"
/>
<ContentPresenter
Grid.Column="1"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
RecognizesAccessKey="True"/>
</Grid>
</Microsoft_Windows_Themes:ButtonChrome>
在所有级别上,网格、镀铬。。并尝试了各种SnapsToDevicePixels组合,但图像无法正确显示。我将“拉伸”设置为“无”,图像在中心对齐,但为什么它会自动拉伸
这里是输出和它非常令人沮丧
图像的实际大小是16x16,但我通过使用Windows Maginifier了解到,无论我做什么,图像实际上都试图渲染为20x20,对于较大的图像,它甚至会剪切最右侧和底部。我认为,当Stretch=None时,图像应该正确渲染为16x16,有人能澄清这里的问题吗?尝试设置图像元素的显式宽度和高度。这是一个已知的wpf问题,microsoft尚未解决。唯一的解决办法是调整大小,使其不会以小数像素部分的大小结束。调整图像大小,这样就可以了。我创建了一个按钮样式,并覆盖了控件模板,为其提供了自定义高度
您可能想考虑在WPF4中尝试新的可用属性。将
RenderOptions.BitmapScalingMode
保留为高质量,或者干脆不声明它
在根元素(即主窗口)上添加以下属性:UseLayoutRounding=“True”
以前仅在Silverlight中可用的属性现在修复了所有位图大小问题。:)
请注意-一些效果
在精确布局上可以有:
- 元素的宽度和/或高度最多可以增加或减少1个像素
- 对象的放置最多可以移动1个像素
- 居中图元最多可以垂直或水平偏离中心 1像素
更多信息请参见此处:如果您认为您的图像是16x16,但WPF似乎认为它是20x20,那么您的图像本身可能存在DPI问题。你的图像是PNG吗?将其另存为jpg,然后查看其外观
Ref:因为未明确调整大小的元素将倾向于(也有例外)采用其容器的大小。设置明确大小16x16将裁剪图像,我可以看到该图像仅显示16x16,但缺少的部分仍显示它试图显示20x20。当“水平对齐”和“垂直对齐”设置为“中心”时,它应该将自身杠杆拉伸到父容器,对吗?
RenderOptions.BitmapScalingMode="NearestNeighbor"