2

我有一个由使用路径绘制的图标/画布对象组成的 ResourceDictionary。我的 ViewModel 包含一个字符串属性 (IconName),其中包含与 ResourceDictionary 中的条目之一匹配的字符串。我开发了一个接收字符串的 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 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 有一个 Path 子节点,其中填充了正确的 Data 成员)。

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