Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在XAML中设置此图像源?_C#_Wpf_Image_Data Binding_Xaml - Fatal编程技术网

C# 如何在XAML中设置此图像源?

C# 如何在XAML中设置此图像源?,c#,wpf,image,data-binding,xaml,C#,Wpf,Image,Data Binding,Xaml,目前,我在MainWindow.xaml中有以下内容: <Image Name="LogoImage" /> 我这样做是因为我喜欢将图像作为嵌入式资源保存,所以在用户安装目录中没有一堆随机文件 但是如何从XAML而不是C#管理图像绑定(最后3行代码) 或者,如果任何人对他们如何管理图像资源有任何意见,请与我分享。在WPF中,您需要使用资源的编译操作,而不是嵌入式资源。然后你可以随心所欲地访问它 编辑 如果您有使用嵌入式资源,可以使用IValueConverter来实现。您基本上是将

目前,我在MainWindow.xaml中有以下内容:

<Image Name="LogoImage" />
我这样做是因为我喜欢将图像作为嵌入式资源保存,所以在用户安装目录中没有一堆随机文件

但是如何从XAML而不是C#管理图像绑定(最后3行代码)


或者,如果任何人对他们如何管理图像资源有任何意见,请与我分享。

在WPF中,您需要使用
资源的编译操作,而不是
嵌入式资源
。然后你可以随心所欲地访问它

编辑

如果您使用嵌入式资源,可以使用
IValueConverter
来实现。您基本上是将代码移动到一个可重用类中,但它看起来是这样的:

public class ImageLoadingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !(value is string)) return null;

        var rm = new ResourceManager("Project.Properties.Resources", GetType().Assembly);

        using (var stream = rm.GetStream((string)value))
        {
            return BitmapFrame.Create(stream);
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
然后您可以这样使用它:

<lcl:ImageLoadingConverter x:Key="imageLoader" />

...

<Image Source="{Binding Source=LogoImage.png, Converter={StaticResource imageLoader}}" />

...

在WPF中,您需要使用
资源
的编译操作,而不是
嵌入式资源
。然后你可以随心所欲地访问它

编辑

如果您使用嵌入式资源,可以使用
IValueConverter
来实现。您基本上是将代码移动到一个可重用类中,但它看起来是这样的:

public class ImageLoadingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !(value is string)) return null;

        var rm = new ResourceManager("Project.Properties.Resources", GetType().Assembly);

        using (var stream = rm.GetStream((string)value))
        {
            return BitmapFrame.Create(stream);
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
然后您可以这样使用它:

<lcl:ImageLoadingConverter x:Key="imageLoader" />

...

<Image Source="{Binding Source=LogoImage.png, Converter={StaticResource imageLoader}}" />

...

也许我遗漏了一些东西,但是如果图像是一种资源,那么你应该能够做到:那么,既然WPF已经为你提供了内置的方法,你为什么要这样做呢?如果将编译设置为“Resource”,它将嵌入到dll或exe中,您可以通过在标记上设置Source属性直接访问它。好的,我对嵌入的资源与资源有一些混淆。感谢您的反馈,我将接受下面的答案。也许我遗漏了一些东西,但是如果图像是一种资源,您应该能够做到:那么,既然WPF有内置的方法为您做到这一点,您为什么要这样做呢?如果将编译设置为“Resource”,它将嵌入到dll或exe中,您可以通过在标记上设置Source属性直接访问它。好的,我对嵌入的资源与资源有一些混淆。感谢您的反馈,我将接受下面的答案。这个问题的重点是如何在嵌入式资源的编译操作中使用图像。因此,虽然它的输入很好,但它并没有回答问题。好吧,所以我对它进行了编辑,以向您展示一种在需要嵌入式资源时执行此操作的方法(我假设一个传统应用程序共享此资源,就像在纯WPF应用程序中一样,没有理由这样做)。如上所述,嵌入式资源和资源都被编译到程序集中,因此,如果您只是试图避免松散的文件,我绝对建议您使用Resource build操作。这个问题的全部要点是如何将映像与嵌入式资源的编译操作一起使用。因此,虽然它的输入很好,但它并没有回答问题。好吧,所以我对它进行了编辑,以向您展示一种在需要嵌入式资源时执行此操作的方法(我假设一个传统应用程序共享此资源,就像在纯WPF应用程序中一样,没有理由这样做)。如上所述,嵌入式资源和资源都被编译到程序集中,因此,如果您只是试图避免松散的文件,我绝对建议使用资源构建操作。