对于我的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
。
我做错了什么或者使用控制对象作为静态资源是不可能的?
答案 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) };