如何动态地从代码隐藏在WPF与Properties.Resources图像改变图像来源?如何动态地从

2019-05-06 05:20发布

我有一个需要提供反馈有关内部状态的用户WPF应用程序。 该设计是有三幅图像,称他们为红,黄,绿等。 这些图像之一将在同一时间取决于状态显示。 这里有几点:

  • 这三个图像是Properties.Resources在代码隐藏
  • 只有图像中的一个将在同一时间显示。
  • 状态的变化来自于后台代码,而不是来自于用户的处理。
  • 我要绑定的图像控制,这样我可以从代码隐藏图像发生变化。

我假设我需要的图像转换为JPG图像改变的图像源,如:


[ValueConversion(typeof(System.Drawing.Bitmap), typeof(ImageSource))]
public class BitmapToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var bmp = value as System.Drawing.Bitmap;
        if (bmp == null)
            return null;
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    bmp.GetHbitmap(),
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

我宁愿在图像初始化过程中转换一次,并保持图像源的列表。 我也假设我需要一个依赖属性的控件绑定,但我不知道如何设置了图像源的这个名单:


    // Dependancy Property for the North Image
    public static readonly DependencyProperty NorthImagePathProperty
        = DependencyProperty.Register(
            "NorthImagePath",
            typeof(ImageSource),
            typeof(MainWindow),
            new PropertyMetadata("**Don't know what goes here!!!**"));

    // Property wrapper for the dependancy property
    public ImageSource NorthImagePath
    {
        get { return (ImageSource)GetValue(NorthImagePathProperty); }
        set { SetValue(NorthImagePathProperty, value); }
    }

Answer 1:

虽然在WPF项目中的图像资源生成System.Drawing.Bitmap财产Resources.Designer.cs ,你可以直接创建BitmapImage从资源。 你只需要设置生成操作的图像文件,以Resource (而不是默认的None )。

如果你有一个文件Red.jpgResources Visual Studio项目的文件夹中,创建一个BitmapImage会是什么样如下图所示。 它使用WPF包URI 。

var uri = new Uri("pack://application:,,,/Resources/Red.jpg");
var bitmap = new BitmapImage(uri);

如果你有一个Image宣布某处XAML这样的控制:

<Image x:Name="image"/>

你可以简单地设定Source图像的属性在你的代码背后的BitmapImage:

image.Source = bitmap;

如果您希望设置的Source由绑定,您可以创建一个属性string ,返回图像URI属性。 该字符串将自动转换为BitmapImage通过内置的TypeConverter在WPF。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        ImageUri = "pack://application:,,,/Resources/Red.jpg";
    }

    public static readonly DependencyProperty ImageUriProperty =
        DependencyProperty.Register("ImageUri", typeof(string), typeof(MainWindow));

    public string ImageUri
    {
        get { return (string)GetValue(ImageUriProperty); }
        set { SetValue(ImageUriProperty, value); }
    }
}

在XAML中,你会绑定到像这样的属性:

<Image Source="{Binding ImageUri}"/>

当然,你还可申报财产为类型ImageSource

public static readonly DependencyProperty ImageProperty =
    DependencyProperty.Register("Image", typeof(ImageSource), typeof(MainWindow));

public ImageSource Image
{
    get { return (ImageSource)GetValue(ImageProperty); }
    set { SetValue(ImageProperty, value); }
}

并结合以同样的方式:

<Image Source="{Binding Image}"/>

现在,你可以预先加载图片并把它们纳入物业需要:

private ImageSource imageRed =
    new BitmapImage(new Uri("pack://application:,,,/Resources/Red.jpg"));
private ImageSource imageBlue =
    new BitmapImage(new Uri("pack://application:,,,/Resources/Blue.jpg"));
...
Image = imageBlue;

UPDATE:毕竟,你的图像并不需要在Visual Studio项目资源。 你可以只添加一个项目文件夹,把图像文件到该文件夹,并设置其生成操作Resource 。 例如,如果你调用的文件夹Images ,该URI将pack://application:,,,/Images/Red.jpg



文章来源: How do I change an image source dynamically from code-behind in WPF with an image in Properties.Resources?