我们在资源字典中存储了一组SVG。
示例:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DrawingImage x:Key="Bell">
<DrawingImage.Drawing>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<GeometryDrawing Brush="#FF000000" Pen="{x:Null}">
<GeometryDrawing.Geometry>
<PathGeometry FillRule="Nonzero" Figures="........." />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</ResourceDictionary>
如果您注意到GeometryDrawing Brush设置为#ff000000(黑色)。 我们面临的问题是允许视图显示此SVG并在运行时分配颜色(通过绑定)
我们的窗口(视图)具有资源字典,其中包含Window.Resources内的图标。
我们正在寻找这样的解决方案:
<Image Source="{StaticResource Bell}" Fill="#FF884422"/>
答案 0 :(得分:0)
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<DrawingImage x:Key="Bell1">
<DrawingImage.Drawing>
<DrawingGroup Opacity="1">
<DrawingGroup Opacity="1">
<DrawingGroup Opacity="1">
<GeometryDrawing Brush="{Binding Color}" Pen="{x:Null}">
<GeometryDrawing.Geometry>
<PathGeometry FillRule="Nonzero" Figures="M 10,100 C 10,300 300,-200 300,100" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingGroup>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</Window.Resources>
<Grid>
<local:MyImage DataContext="{Binding ElementName=myImage, Mode=OneWay}" x:Name="myImage" Color="Red" Source="{StaticResource Bell1}" ></local:MyImage>
</Grid>
答案 1 :(得分:0)
DrawingImage将接收与窗口相同的datacontext,因此您可以将颜色绑定到窗口视图模型上的属性。
Dictionary1.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DrawingImage x:Key="Bell">
<DrawingImage.Drawing>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<GeometryDrawing Brush="{Binding IconColor}" Pen="{x:Null}">
<GeometryDrawing.Geometry>
<PathGeometry FillRule="Nonzero" Figures="........." />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</ResourceDictionary>
MyTestWindow.xaml
<Window x:Class="MyTestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ResourceDictionary Source="Dictionary1.xaml" />
</Window.Resources>
<Grid>
<Image Source="{StaticResource Bell}" />
</Grid>
</Window>
然后视图模型需要一个IconColor属性。
答案 2 :(得分:0)
通过建立在Paolo的非工作答案之上,我能够解决这个问题。
“MyImage”类:
Public Class MyImage
Inherits System.Windows.Controls.Image
Public Property Color As System.Windows.Media.SolidColorBrush
End Class
在资源字典中,将DrawingImage指定给MyImage样式的Source setter:
<Style TargetType="{x:Type local:MyImage}" x:Key="Bell">
<Setter Property="Source">
<Setter.Value>
<DrawingImage>
<DrawingImage.Drawing>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<DrawingGroup Opacity="1">
<DrawingGroup.Children>
<GeometryDrawing Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyImage}}, Path=Color}" Pen="{x:Null}">
其余部分正如您所期望的那样。
在窗口的XAML文件中:
<Window
...
xmlns:local="clr-namespace:AppNameHere">
<Window.Resources>
<ResourceDictionary Source="DictionaryName.xaml" />
</Window.Resources>
....
<Grid Background="Black">
<local:MyImage Color="Chartreuse" Width="30" Height="30" Style="{StaticResource Bell}" />
</Grid>
...
</Window>
答案 3 :(得分:0)
看看这个工具: https://github.com/BerndK/SvgToXaml
它可以自动将所有svg转换为一个xaml。颜色是分开的,可以一次为所有图像设置,也可以仅为一个图像设置。包含了在运行时更改颜色的示例代码。
该工具也是一个svg浏览器,查看器......