2

パスで描画されたアイコン/キャンバス オブジェクトで構成される ResourceDictionary があります。私の ViewModel には、ResourceDictionary のエントリの 1 つに一致する文字列を含む文字列プロパティ (IconName) が含まれています。文字列を受け取る MultiBinding (IMultiValueConverter) と、FrameworkElement を開発し、リソース ルックアップを実行して、名前に一致するリソースを返します。この時点に到達する前に、ビューを次のように明示的にスタブ化しました。

<Rectangle Width="10" Height="10" Margin="0,0,10,0">
   <Rectangle.Fill>
       <VisualBrush Stretch="Fill" Visual="{StaticResource defalt_icon}" />
   </Rectangle.Fill>
</Rectangle>

これは正しくレンダリングされます。ただし、次のように切り替えると、Rectangle には何もレンダリングされません。

<Rectangle Width="10" Height="10" Margin="0,0,10,0">
    <Rectangle.Fill>
        <VisualBrush Stretch="Fill">
            <VisualBrush.Visual>
                <MultiBinding Converter="{StaticResource IconNameConverter}">
                    <MultiBinding.Bindings>
                        <Binding RelativeSource="{RelativeSource AncestorType=FrameworkElement}"/>
                        <Binding Path="IconName"/>
                    </MultiBinding.Bindings>
                </MultiBinding>
            </VisualBrush.Visual>
        </VisualBrush>
    </Rectangle.Fill>
</Rectangle>

私のコンバーター (以下に表示) が呼び出され、Canvas オブジェクトを見つけて返します (デバッガーでオブジェクトを表示すると、Canvas には適切な Data メンバーが入力された Path 子があることがわかります)。

public class IconNameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        FrameworkElement targetElement = values[0] as FrameworkElement;
        string iconName = values[1] as string;

        if (iconName == null)
            return null;

        FrameworkElement newIcon = (FrameworkElement)targetElement.TryFindResource(iconName);

        if (newIcon == null)
            newIcon = (FrameworkElement)targetElement.TryFindResource("appbar_page_question");

        return newIcon;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

キャンバスが表示されない理由はありますか?

4

0 に答える 0