1

特定の条件に応じて、複数のアイコン サイズを許可しようとしています。'Images\Icons\...\*.png' ここで ... はサイズ (16、32、64、128、256 など) です。各フォルダーにはすべての指定されたサイズに最適化されたアイコン。

私の問題は、画像ソースパスでフォルダーを指定できないようです...つまり:

<Image x:Name  = "img" 
       Stretch = "None" 
       Source  = "{Binding StringFormat=Images\Icons\{0}\Multi.png, 
                   RelativeSource={RelativeSource Self}, 
                   Path=Parent.Parent.Tag}" />

今のところ、フォルダー名を祖父母のタグに保存しているだけです (将来的には別のものにバインドする予定ですが、今はこのビットをつなぎ合わせようとしています)。上記の xaml をビルドしようとすると、エラーが発生します。

The text \Multi.png ... is not allowed after the closing } of a markup extension.

これは、{0} が文字列形式の一部ではなく、マークアップ拡張機能として認識されていることを信じさせてくれます。{} でエスケープし、一重引用符を使用して文字列形式を指定することについて読んだことがありますが、どちらも機能しません。

Source  = "{Binding StringFormat={}Images\Icons\{0}\Multi.png, ...

上記は、まったくエスケープしない場合と同じエラーを返します..

Source  = "{Binding StringFormat='Images\Icons\{0}\Multi.png', ...

Source  = "{Binding StringFormat='{}Images\Icons\{0}\Multi.png', ...

上記の 2 つはエラーの発生を防ぎますが、画像ソースが null になります。

誰もこれを達成する方法を知っていますか?

(明確にするために、祖父母のタグが '16' に設定されている場合、画像ソースを Images\Icons\16\Multi.png にバインドする必要があります。タグが '32' に設定されている場合は、バインドする必要がありますソースを Images\Icons\32\Multi.png に変更. テストとして grandparents タグをフルパスに設定し、stringformat を除外. grandparents タグへの相対バインディングが成功し、画像が表示されました. 次の場合にのみ失敗します.残りのパスを指定するために、文字列形式でフォルダー名のみを指定しようとします)。

4

1 に答える 1

4

Binding の StringFormatter 属性は、ターゲットが String 型の場合にのみ機能します。それ以外の場合は、単に無視されます。

これは、コンバーターをバインディングに追加することで修正できます。コンバーターは、フォーマット文字列とタグを取得し、フォーマットを適用して、ImageSource に変換します。C# では、コンバーターは次のようになります。

public sealed class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (parameter == null || parameter.Equals(String.Empty)) parameter = "{0}";
        string path = String.Format((string) parameter, value);
        return new BitmapImage(new Uri(path));
    }

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

コンバーターを取得したら、XAML のリソースに次を追加できます。

<local:ImageConverter x:Key="ImageConverter" />

Source バインディングを次のように変更します。

<Image x:Name="img"
       Stretch="None"
       Source="{Binding Parent.Parent.Tag, Converter={StaticResource ImageConverter}, 
                        ConverterParameter='Images\\Icons\\{0}\\Multi.png', 
                        RelativeSource ={RelativeSource Mode=Self}}" 
/>
于 2012-04-11T18:27:31.060 に答える