2014-07-23 52 views
1

我有一个带有ResourceDictionary的.xaml文件,其中包含我所有的自定义图标。从资源中显示XAML中图像的首选方式

例如为:

<Canvas x:Key="imgFoo" Width="16" Height="16"> 
    <Path Fill="#FFFF0000" StrokeThickness="3" Stroke="#FFFF0000" StrokeMiterLimit="4" StrokeLineJoin="Round" StrokeStartLineCap="Round" StrokeEndLineCap="Round"> 
     <Path.Data> 
      <PathGeometry Figures="M 2.0722892 ..... 4.0457831" FillRule="NonZero"/> 
     </Path.Data> 
    </Path> 
</Canvas> 

现在的问题:什么是使用XAML这一资源的最佳方式?

难道例如像这样:

<TabItem> 
    <TabItem.Header> 
     <StackPanel Orientation="Horizontal"> 
      <ContentControl Content="{StaticResource imgFoo}" /> 
      <TextBlock Text="Foo" /> 
     </StackPanel> 
    </TabItem.Header> 

使用ContentControl中使用,并显示该资源的正确方法是什么?

更新: 和这种使用画笔和边框的方法呢?这是一个好方法吗?

<DrawingBrush x:Key="imgF00"> 
    <DrawingBrush.Drawing> 
     <GeometryDrawing> 
      <GeometryDrawing.Pen> 
       <Pen Thickness="3" MiterLimit="4" LineJoin="Round" StartLineCap="Round" EndLineCap="Round" Brush="#FFFF0000" /> 
      </GeometryDrawing.Pen> 
      <GeometryDrawing.Geometry> 
       <PathGeometry Figures="M 2.0722892 ... 4.0457831" FillRule="NonZero" /> 
      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

显示它通过边界:

<TabItem> 
    <TabItem.Header> 
     <StackPanel Orientation="Horizontal"> 
      <Border Background="{StaticResource imgFail2}" Width="16" Height="16" /> 
      <TextBlock Text="Failure" /> 
     </StackPanel> 
    </TabItem.Header> 
+0

对于应用程序中的所有图标,Path属性(Fill,Stroke,StrokeThickness,...)是否相同?或者你是否至少有一组特定的图标路径属性组合? – Clemens

+0

无论如何,你应该避免使用UI元素作为资源。您可以使用PathGeometry作为资源,或者如果每个图标都有不同的填充和描边等,可以使用GeometryDrawing。 – Clemens

+0

当前我的图纸是在此处显示的画布中的路径... – juFo

回答

2

而不是使用UI元素(如帆布的路径)的图标资源,你可以使用DrawingBrush对象是这样的:

<DrawingBrush x:Key="imgFoo" ViewboxUnits="Absolute" Viewbox="0,0,16,16"> 
    <DrawingBrush.Drawing> 
     <GeometryDrawing Brush="#FFFF0000"> 
      <GeometryDrawing.Pen> 
       <Pen Thickness="3" Brush="#FFFF0000" MiterLimit="4" LineJoin="Round" StartLineCap="Round" EndLineCap="Round"/> 
      </GeometryDrawing.Pen> 
      <GeometryDrawing.Geometry> 
       <PathGeometry Figures="..." FillRule="NonZero"/> 
      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

你现在可以使用这样的刷子来做例如矩形的填充属性:

<TabItem.Header> 
    <StackPanel Orientation="Horizontal"> 
     <Rectangle Fill="{StaticResource imgFoo}" Width="16" Height="16"/> 
     <TextBlock Text="Foo" /> 
    </StackPanel> 
</TabItem.Header> 
+0

使用边框或矩形有什么区别吗? (性能,内存使用情况,...?) – juFo

+0

不,没有显着差异。矩形可以被认为更轻量,因为它不能有子元素。 – Clemens

+0

完美,太糟糕了,关于如何做到“正确”的方式没有好的资源:-) – juFo