68

次のように、カスタム オブジェクトのリストを WPF イメージにバインドしようとしています。

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>

しかし、うまくいきません。これは私が得ているエラーです:

「プロパティ 'UriSource' またはプロパティ 'StreamSource' を設定する必要があります。」

私は何が欠けていますか?

4

6 に答える 6

85

WPF には、特定の型の組み込みコンバーターがあります。画像のSourceプロパティをstringまたはUri値にバインドすると、内部で WPF はImageSourceConverterを使用して値をImageSource.

そう

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

ImageSource プロパティが画像への有効な URI の文字列表現である場合に機能します。

もちろん、独自の Binding コンバーターをロールすることもできます。

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString()));
    }

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

次のように使用します。

<Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>
于 2008-08-21T18:38:50.580 に答える
21

Atul Guptaによるこの記事には、いくつかのシナリオをカバーするサンプルコードがあります。

  1. XAMLのSourceプロパティへの通常のリソースイメージのバインド
  2. リソースイメージをバインドしますが、コードビハインドから
  3. Application.GetResourceStreamを使用して、コードビハインドでリソースイメージをバインドする
  4. メモリストリームを介してファイルパスから画像をロードする(データベースからブログ画像データをロードする場合も同様です)
  5. ファイルパスから画像を読み込んでいますが、ファイルパスへのバインドを使用していますプロパティ
  6. 依存関係プロパティを介して内部的に画像コントロールを持つユーザーコントロールに画像データをバインドする
  7. ポイント5と同じですが、ファイルがハードディスクにロックされないようにします
于 2009-05-14T10:18:33.920 に答える
18

子要素を使用するのではなく、単に Source 属性を設定することもできます。これを行うには、クラスがイメージをビットマップ イメージとして返す必要があります。これは私がそれを行った1つの方法の例です

<Image Width="90" Height="90" 
       Source="{Binding Path=ImageSource}"
       Margin="0,0,0,5" />

そして、クラスプロパティは単にこれです

public object ImageSource {
    get {
        BitmapImage image = new BitmapImage();

        try {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.UriSource = new Uri( FullPath, UriKind.Absolute );
            image.EndInit();
        }
        catch{
            return DependencyProperty.UnsetValue;
        }

        return image;
    }
}

値コンバーターよりも少し手間がかかるかもしれませんが、別のオプションです。

于 2008-08-21T17:45:11.190 に答える
8

ここで選択した回答の問題は、前後に移動すると、ページが表示されるたびにコンバーターがトリガーされることです。

これにより、新しいファイルハンドルが継続的に作成され、ファイルがまだ使用されているため、ファイルを削除しようとする試みがブロックされます。これは、ProcessExplorerを使用して確認できます。

ある時点で画像ファイルが削除される可能性がある場合は、次のようなコンバーターが使用される可能性があります 。XAMLを使用してSystem.Drawing.ImageをSystem.Windows.Imageコントロールにバインドする

このメモリストリーム方式の欠点は、画像が毎回読み込まれてデコードされ、キャッシュが実行されないことです。「画像が複数回デコードされないようにするには、使用するのではなく、UriからImage.Sourceプロパティを割り当てます。メモリストリーム」出典:「XAMLを使用したWindowsストアアプリのパフォーマンスのヒント」

パフォーマンスの問題を解決するために、リポジトリパターンを使用してキャッシングレイヤーを提供できます。キャッシュはメモリ内で行われる可能性があり、メモリの問題が発生する可能性があります。または、アプリの終了時にクリアできる一時フォルダにあるサムネイルファイルとしても発生する可能性があります。

于 2012-12-15T19:36:03.383 に答える
8

uri を画像に変換するIValueConverterインターフェイスの実装が必要です。IValueConverter の Convert 実装は次のようになります。

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();

return image;

次に、バインディングでコンバーターを使用する必要があります。

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
    </Image.Source>
</Image>
于 2008-08-21T17:35:54.427 に答える