9

我有一个 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); }
    }
4

1 回答 1

32

尽管 WPF 项目中的图像资源会在 中生成System.Drawing.Bitmap属性,但您可以直接从该资源Resources.Designer.cs创建一个。BitmapImage您只需要将镜像文件的Build ActionResource设置为(而不是默认的None)。

如果您的 Visual Studio 项目的文件夹中有一个文件Red.jpg,则Resources创建一个BitmapImage如下所示的文件。它使用WPF Pack 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 的属性。该字符串将由WPFBitmapImage中的内置程序自动转换为 a 。TypeConverter

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;

更新:毕竟,您的图像不需要是 Visual Studio 项目中的资源。您可以只添加一个项目文件夹,将图像文件放入该文件夹并将其构建操作设置为Resource. 例如,如果您调用文件夹Images,则 URI 将是pack://application:,,,/Images/Red.jpg

于 2013-02-21T17:06:56.033 回答