C# 使用 XAML 文件作为矢量图像源
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1107334/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using a XAML file as a vector Image Source
提问by Joe White
I would like to be able to use vector graphics, preferably defined in XAML, as the Source of an Image control, just like I can currently use a raster image like a PNG. That way I could easily mix and match between bitmap and vector images, like this:
我希望能够使用矢量图形(最好在 XAML 中定义)作为图像控件的源,就像我目前可以使用像 PNG 这样的光栅图像一样。这样我就可以轻松地在位图和矢量图像之间混合和匹配,如下所示:
<StackPanel>
<Image Source="Images/Namespace.png"/>
<Image Source="Images/Module.xaml"/>
</StackPanel>
Module.xaml would most likely have <DrawingImage>
as its root element instead of <UserControl>
.
Module.xaml 很可能将<DrawingImage>
其作为根元素而不是<UserControl>
.
Actually, what I'm really going for is this, so my ViewModel could select either a raster or vector image at its discretion:
实际上,我真正想要的是这个,所以我的 ViewModel 可以自行选择光栅或矢量图像:
<Image Source="{Binding ImageUri}"/>
Is this possible? Can Image.Source load XAML classes from a given URI? Or is it only able to load bitmap resources?
这可能吗?Image.Source 可以从给定的 URI 加载 XAML 类吗?还是只能加载位图资源?
回答by Jobi Joy
1) Add the DrawingImage.xaml to the project and set its properties to 'BuildAction=Content' and 'Copy Always'. Or else you can dynamically load the XAML from outside since the logic I am going to explain will work for loose-xaml also.
1) 将 DrawingImage.xaml 添加到项目并将其属性设置为“BuildAction=Content”和“Copy Always”。否则,您可以从外部动态加载 XAML,因为我将要解释的逻辑也适用于松散 xaml。
2) Write a Converter to convert the XAML uri to UIELement, in your case it will be always DrawingImage
2) 编写一个转换器将 XAML uri 转换为 UIELement,在您的情况下它将始终是 DrawingImage
public class FileToUIElementConverter :IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
FileStream fileStream = new FileStream((string)parameter, FileMode.Open);
return XamlReader.Load(fileStream) as DrawingImage;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
3) Write the XAML as below
3)编写XAML如下
<Window.Resources>
<local:FileToUIElementConverter x:Key="uriToUIElementConverter"/>
</Window.Resources>
<Grid>
<Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/>
</Grid>
回答by Ray
You can simply reference your vector graphics as StaticResources:
您可以简单地将矢量图形引用为 StaticResources:
<Image Source="{StaticResource MyImage}" />
Store the images in a ResourceDictionary as DrawImage's. Expression Blend can help you generate this stuff:
将图像作为 DrawImage 存储在 ResourceDictionary 中。Expression Blend 可以帮助您生成以下内容:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DrawingImage x:Key="MyImage">
<DrawingImage.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/>
<GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/>
:
</DrawingGroup.Children>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</ResourceDictionary>
回答by Jeff B
Embed the XAML resource (DrawingImage) with type 'Resource'. It is then not a separate file and can be directly referenced via a URI, as in your original example -- BUT the URI is non-trivial. You have to figure out Microsoft's "pack" URI syntax and use that.
嵌入类型为“Resource”的 XAML 资源 (DrawingImage)。它不是一个单独的文件,可以通过 URI 直接引用,就像在您的原始示例中一样——但 URI 是重要的。您必须弄清楚 Microsoft 的“pack” URI 语法并使用它。