9

内部状態についてユーザーにフィードバックを提供する必要があるWPFアプリケーションがあります。デザインは、赤、黄、緑の3つの画像を使用することです。状態に応じて、これらの画像の1つが一度に表示されます。ポイントは次のとおりです。

  • 3つの画像は、分離コードのProperties.Resourcesにあります。
  • 一度に表示される画像は1つだけです。
  • 状態の変化は、ユーザーからではなく、コードビハインドのプロセスから発生します。
  • 画像をコードビハインドから変更できるように、画像コントロールをバインドしたいと思います。

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直接作成することもできます。画像ファイルのBuild Actionを(デフォルトではなく)BitmapImageに設定するだけで済みます。ResourceNone

Visual Studio プロジェクトRed.jpgのフォルダーにファイルがある場合、作成すると次のようになります。WPF Pack Uriを使用します。ResourcesBitmapImage

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;

バインディングによってプロパティを設定したい場合は、画像 URI を返すプロパティをSource作成できます。文字列は、組み込みのWPFによってstring自動的に に変換されます。BitmapImageTypeConverter

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 に答える