使用控件作为静态资源会导致ArgumentException

时间:2014-05-20 14:29:28

标签: xaml windows-phone-8 windows-phone

对于我的Windows Phone 8.1应用,我试图将图标作为静态资源提供,方法是将它们放入我的XAML页面ResourceDictionary

<phone:PhoneApplicationPage.Resources>
  <ResourceDictionary>
    <Path x:Name="MyIcon" Width="38" Height="31.6667" Fill="{StaticResource PhoneForegroundBrush}" Data="..."/>
  </ResourceDictionary>
</phone:PhoneApplicationPage.Resources>

当我尝试在代码隐藏的按钮中使用MyIcon

Button buyButton = new Button { Content = MyIcon };

... ArgumentException被抛出此行:Value does not fall within the expected range.

直接在XAML中引用MyIcon时,它在可视化编辑器中正确显示,但在页面加载时会导致XAMLParseException

我做错了什么或者使用控制对象作为静态资源是不可能的?

1 个答案:

答案 0 :(得分:1)

您不能在视觉/逻辑树的少数位置使用UIElement的一个实例。因此,您的路径当前位于树中,无法使用。 我在上一个项目中遇到了同样的问题,我的解决方案是通过值转换器创建路径。

public class PathConv
    : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var data = value as string;
        if (data == null)
        {
            return value;
        }
        return CreatePath(data);
    }

    private Path CreatePath(string pathString)
    {
        var xaml = string.Format("<Path xmlns='{0}'><Path.Data>{1}</Path.Data></Path>",
            "http://schemas.microsoft.com/winfx/2006/xaml/presentation",
            pathString);

        return XamlReader.Load(xaml) as Path;
    }

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

现在您可以创建一个字符串资源并将其转换为路径

<phone:PhoneApplicationPage.Resources>
  <ResourceDictionary>
    <PathConv x:Name="conv" />
    <String x:Key="PathData">...</String>
  </ResourceDictionary>
</phone:PhoneApplicationPage.Resources>

现在你可以写这样的东西了

Button buyButton = new Button { Content = conv.Convert(Resources["PathData"], null, null, null) };