编译后XAML图像变形

时间:2016-04-12 11:08:30

标签: c# wpf xaml

在自定义控件模板中有一个复选框,在设计视图中如下所示:

Non distorted image

XAML代码:

<CheckBox IsChecked="{Binding Fareklasse21}" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1">
<CheckBox.Template>
    <ControlTemplate>
        <StackPanel Orientation="Vertical"  VerticalAlignment="Center">
            <Image Source="pack://application:,,,/Asd.WWs.Client.Wpf;component/Resources/ADR-M.png" Width="64" Height="64" SnapsToDevicePixels="True">
            </Image>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}"></CheckBox>
                <TextBlock>2.1</TextBlock>
            </StackPanel>
        </StackPanel>
    </ControlTemplate>
</CheckBox.Template>

当我启动应用程序时,图像(原来是64x64px)会变形(并放大?)

distorted

可能是图像从Prism包装器继承了一些值吗?在进行实时检查时,我真的看不到任何有趣的事情:

Live inspection tree

以下是特定图片的属性:

Live Property Explorer

1 个答案:

答案 0 :(得分:3)

WPF图形系统使用device-independent units来启用分辨率和设备独立性。每个独立设备的像素都会自动按系统的每英寸点数(dpi)设置进行缩放。这为WPF应用程序提供了针对不同dpi设置的适当缩放,并使应用程序自动识别dpi。另请参阅wiki page

这就是为什么如果你甚至为Image控件指定Stretch = None,你可能会注意到图像没有以预期的宽/高像素数出现。如果图像的分辨率(DPI)与当前系统DPI不匹配,则会发生这种情况。

从物理像素到DIP的转换使用以下公式。

  

DIPs = pixels /(SystemDPI / 96.0)

如果您想将DIP转换为“真实”像素,您可以使用下一个公式:

  

宽度(像素)=宽度(WPF单位)*(SystemDPI / 96)

     

高度(像素)=高度(WPF单位)*(SystemDPI / 96)

您可以在DIP, inches, centimeters or points中指定元素大小。但如果可能的话,最好使用矢量化图形。

如果您有SVG文件,可以通过nuget使用sharpvector框架:

Install-Package SharpVectors

所以有SvgViewbox在XAML中呈现SVG:

<UserControl ...
         xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
         ...>
    ...
    <svgc:SvgViewbox Margin="5" Height="20" Width="20" Stretch="Uniform" Source="/Resources/Icons/Sample.svg"/>
    ...
</UserControl>