【问题标题】:WPF Using XAML Image SourceWPF 使用 XAML 图像源
【发布时间】:2014-02-05 16:55:18
【问题描述】:

我正在尝试使用 XamlReader 在 Image.Source 中显示我的矢量图像。我有一个这样的 XAML 资源。

<Canvas Width="76" Height="76" ClipToBounds="True" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Path Fill="#FF000000" Height="76" Stretch="Fill" Width="76">
    <Path.Data>
        <PathGeometry FillRule="Nonzero" Figures="M21,30.0001L55.9999,30.0001 55.9999,50 21,50 21,30.0001z M52,28L37,28C38,25,39.4999,24.0001,39.4999,24.0001L50.75,24C51.3023,24,52,24.6977,52,25.25L52,28z" />
    </Path.Data>
</Path>

here 创建了一个绑定。但是当我尝试使用它时它不起作用:

<Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=images/Folder.xaml}"/>

文件的属性Build Action=Resource。转换器uriTOUIElementConverter 是:

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();
    }
}

当我尝试构建项目时,它给了我这些错误:

System.IO.FileNotFoundException

我这样编辑转换器:

Stream fileStream = Application.GetResourceStream(new Uri("pack://application:,,,/ASSEMBLYNAME;component/"+(string) parameter)).Stream;

但它不再起作用了。我应该怎么做才能让它发挥作用?

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    您需要提供的路径 Application.GetResourceStream 是相对于应用程序包的。

    例子:

    我有 XAML 文件 Images/Folder.xaml。 Folder.xaml 的构建操作是资源

    文件夹.xaml

    <DrawingImage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
        <DrawingImage.Drawing>
            <GeometryDrawing Brush="LimeGreen">
                <GeometryDrawing.Geometry>
    
                    <PathGeometry FillRule="Nonzero"
                                  Figures="M21,30.0001L55.9999,30.0001 55.9999,50 21,50 21,30.0001z M52,28L37,28C38,25,39.4999,24.0001,39.4999,24.0001L50.75,24C51.3023,24,52,24.6977,52,25.25L52,28z" />
    
                </GeometryDrawing.Geometry>
            </GeometryDrawing>
        </DrawingImage.Drawing>
    </DrawingImage>
    

    转换器:

    public class FileToUIElementConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string path = parameter.ToString();
    
            StreamResourceInfo sri = Application.GetResourceStream(new Uri(path, UriKind.Relative));
            if (sri != null)
            {
                using (Stream stream = sri.Stream)
                {
                    var logo = XamlReader.Load(stream) as DrawingImage;
    
                    if (logo != null)
                    {
                        return logo;
                    }
                }
            }
    
            throw new Exception("Resource not found");
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    用法:

    <Image x:Name="ImageLogo" Source="{Binding Converter={StaticResource FileToUiElementConverter}, ConverterParameter=images/folder.xaml}"/>
    

    【讨论】:

    • 以防万一,有一个 similar answer 但为“Visual Studio 图像库”中的 &lt;icon&gt;.xaml 文件量身定制
    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多