如何使用XAML矢量图像作为图像源的Windows 8应用(How to use xaml vect

2019-08-16 20:48发布

我创造了一些资产和Inkscape的希望在Windows 8的应用程序使用它们作为图标。 我已经做了一些阅读和它的接缝,虽然.NET 4.5支持SVG, 现代的UI个人资料不 。 我转换使用SVG为XAML 这个工具。

我得到了下面的XAML。

<Canvas xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="svg2997" Width="744.09448" Height="1052.3622" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Canvas x:Name="layer1">
    <Path Fill="#FFCCCCCC" Stroke="#FF000000" StrokeThickness="1.34377062" StrokeMiterLimit="4" x:Name="path3007" Data="M372.58272,134.72445C167.96301,134.72445 2.06820310000001,300.58818 2.06820310000001,505.20789 2.06820310000001,709.8276 167.96301,875.72241 372.58272,875.72241 577.20243,875.72241 743.06616,709.8276 743.06616,505.20789 743.06616,300.58818 577.20243,134.72445 372.58272,134.72445z M280.73888,251.77484L455.94149,251.77484 455.94149,413.70594 628.16035,413.70594 628.16035,588.97071 455.94149,588.97071 455.94149,773.71514 280.73888,773.71514 280.73888,588.97071 106.22005,588.97071 106.22005,413.70594 280.73888,413.70594 280.73888,251.77484z" />
  </Canvas>
</Canvas>

如果我添加此直接到我的应用程序的XAML,它将使但规模路要走。

我想以此作为图像对象如果可能的图像源。

<Image HorizontalAlignment="Left" Height="100" Margin="127,37,0,0" VerticalAlignment="Top" Width="100" Source="Assets/plus_circle.xaml"/>

可以这样做?

Answer 1:

大多数AppBar按钮基于包含在StandardStyles称为AppBarButtonStyle风格。

要自定义按钮,您将AutomationProperties.Name附加属性的文本,以自定义设置Content属性按钮的图标,它也是设置无障碍原因AutomationProperties.AutomationId附加属性是个好主意。

下面是使用这种方法自定义按钮的例子:

<Style x:Key="FolderButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
    <Setter Property="AutomationProperties.AutomationId" Value="FolderAppBarButton"/>
    <Setter Property="AutomationProperties.Name" Value="Folder"/>
    <Setter Property="Content" Value="&#xE188;"/>
</Style>

如上文所述,自定义图标设置Content属性。 我们面临的挑战是如何设置的内容,使其显示您的自定义矢量艺术。

事实证明,你可以将任何路径XAML中,即使你的,到视框来改变其规模。 这是我的第一种方法,但它不能正常工作。 事实上,看来你使用的XAML扩展符号设置Content属性的按钮它不工作的任何时间。

<Style x:Key="SquareButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
<Setter Property="AutomationProperties.AutomationId" Value="SquareAppBarButton"/>
<Setter Property="AutomationProperties.Name" Value="Square"/>
<Setter Property="Content">
    <Setter.Value>
        <!-- This square will never show -->
        <Rectangle Fill="Blue" Width="20" Height="20" />
    </Setter.Value>
</Setter>

实际上,我认为这是一个错误,但幸运的是有一种变通方法。

蒂姆·豪雅在使用XAML中的路径作为艺术品的按钮最简单的方法写了一篇很好的文章。 这篇文章是在这里:

http://timheuer.com/blog/archive/2012/09/03/using-vectors-as-appbar-button-icons.aspx

总之,你需要定义一个正确设置所有绑定样式:

<Style x:Key="PathAppBarButtonStyle" BasedOn="{StaticResource AppBarButtonStyle}" TargetType="ButtonBase">
<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Path Width="20" Height="20" 
                Stretch="Uniform" 
                Fill="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
                Data="{Binding Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
        </DataTemplate>
    </Setter.Value>
</Setter>

然后创建从风格继承的样式,您可以在您的路径粘贴。 这里是你的作品,你上面列出的风格:

<Style x:Key="CrossButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource PathAppBarButtonStyle}">
    <Setter Property="AutomationProperties.AutomationId" Value="CrossAppBarButton"/>
    <Setter Property="AutomationProperties.Name" Value="Cross"/>
    <Setter Property="Content" Value="M372.58272,134.72445C167.96301,134.72445 2.06820310000001,300.58818 2.06820310000001,505.20789 2.06820310000001,709.8276 167.96301,875.72241 372.58272,875.72241 577.20243,875.72241 743.06616,709.8276 743.06616,505.20789 743.06616,300.58818 577.20243,134.72445 372.58272,134.72445z M280.73888,251.77484L455.94149,251.77484 455.94149,413.70594 628.16035,413.70594 628.16035,588.97071 455.94149,588.97071 455.94149,773.71514 280.73888,773.71514 280.73888,588.97071 106.22005,588.97071 106.22005,413.70594 280.73888,413.70594 280.73888,251.77484z"/>
</Style>

最后,你在AppBar像这样使用它:

<Button Style="{StaticResource CrossButtonStyle}" />

开发支持,设计支持和方式更真棒善良: http://bit.ly/winappsupport



Answer 2:

我敢肯定的,你不能只是注入Path DataImage Source ,并期望它神奇的工作,除非它是通过一个图形对象的来源 。 但是什么你能做的就是通过你的PathContentControl用于以同样的方式再利用,而不必经历的麻烦Drawing对象的每个实例。

因此,而不是;

<Image Source="..."/>

刚做这样的事情,在你噗通它Object.ResourcesResourceDictionary ;

 <Style x:Key="YourThingy" TargetType="ContentControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContentControl">
                   <Path Fill="#FFCCCCCC" Stroke="#FF000000" StrokeThickness="1.34377062" StrokeMiterLimit="4" x:Name="path3007" Data="M372.58272,134.72445C167.96301,134.72445 2.06820310000001,300.58818 2.06820310000001,505.20789 2.06820310000001,709.8276 167.96301,875.72241 372.58272,875.72241 577.20243,875.72241 743.06616,709.8276 743.06616,505.20789 743.06616,300.58818 577.20243,134.72445 372.58272,134.72445z M280.73888,251.77484L455.94149,251.77484 455.94149,413.70594 628.16035,413.70594 628.16035,588.97071 455.94149,588.97071 455.94149,773.71514 280.73888,773.71514 280.73888,588.97071 106.22005,588.97071 106.22005,413.70594 280.73888,413.70594 280.73888,251.77484z" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

然后,只需扑通它放在你的看法的地方,并多次随你喜欢;

  <ContentControl Style="{StaticResource YourThingy}"/>

但是你会想你的这条道路的发挥。 它似乎将大尺寸,但希望这为你的情况一个很好的选择。 干杯!



文章来源: How to use xaml vector images as image source in Windows 8 app