我正在尝试使用XAML解析器引用LinearGradientBrush,但它无法识别该对象,并且出现异常:
“无法创建未知类型'LinearGradientBrush'”
是否可以在运行时识别此类型?
这是我正在使用的代码:
public static class CustomBrushes
{
public static Brush LinGrad_Bevel()
{
StringReader sr = new StringReader(@"<LinearGradientBrush EndPoint='0.5,1' MappingMode='RelativeToBoundingBox' StartPoint='0.5,0'>
<GradientStop Color='#00F7F7F7' Offset='0'/>
<GradientStop Offset='1'/>
<GradientStop Color='Black' Offset='0.741'/>
<GradientStop Color='Black' Offset='0.75'/>
<GradientStop Color='White' Offset='0.25'/>
</LinearGradientBrush>");
XmlReader xr = XmlReader.Create(sr);
return (Brush)XamlReader.Load(xr);
}
}
我真的不喜欢用XAML编程(特别是因为我所做的大部分工作都是依赖于运行时程序流进行设计的,但是某些对象比C#更加容易在其中进行原型设计,所以我更希望能够使用此方法...
我读过我应该在某处包含这样的行,但是老实说,我不明白为什么,如果我把它放在所有“用法”下,它似乎也行不通
[assembly: XmlnsDefinition("http://schemas.microsoft.com/netfx/2007/xaml/presentation" , "System.Windows.Media")]
无论如何,对于C#代码文件中XAML的运行时解析的任何帮助将不胜感激。
为了回答您的特定问题,在编译XAML时需要提供名称空间声明。最简单的方法是将它们插入您的字符串中。例如:
StringReader sr = new StringReader(@"
<LinearGradientBrush
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
EndPoint='0.5,1' MappingMode='RelativeToBoundingBox' StartPoint='0.5,0'>
<GradientStop Color='#00F7F7F7' Offset='0'/>
<GradientStop Offset='1'/>
<GradientStop Color='Black' Offset='0.741'/>
<GradientStop Color='Black' Offset='0.75'/>
<GradientStop Color='White' Offset='0.25'/>
</LinearGradientBrush>");
XmlReader xr = XmlReader.Create(sr);
return (Brush)XamlReader.Load(xr);
现在,也就是说,我认为以上是实现此目的的最不优选的方法。如果您想要一个可重用的Brush
对象,并且想要使用XAML声明它而不是通过实际的WPF编程API进行声明,那么我认为一种更好的方法是将声明放入Resources
程序的相关集合之一中。
例如,如果您希望能够在整个程序中的多个不同窗口中使用它,则可以通过将其放入App.xaml
文件中来使其成为全局资源:
<Application x:Class="TestSO28999367XamlReader.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<LinearGradientBrush x:Key="beveledLinearGradientBrush"
EndPoint='0.5,1' MappingMode='RelativeToBoundingBox' StartPoint='0.5,0'>
<GradientStop Color='#00F7F7F7' Offset='0'/>
<GradientStop Offset='1'/>
<GradientStop Color='Black' Offset='0.741'/>
<GradientStop Color='Black' Offset='0.75'/>
<GradientStop Color='White' Offset='0.25'/>
</LinearGradientBrush>
</Application.Resources>
</Application>
如果您的使用仅限于一个Window
对象或什至是该对象的某个子元素,则可以在该Resources
对象的集合中添加声明,而不是将其放入中App.xaml
。
无论如何,您都可以使用以下表达式访问它:
(Brush)FindResource("beveledLinearGradientBrush")
当然,您可以随心所欲地为该资源创建密钥……它不一定必须如此beveledLinearGradientBrush
。
通过使用上面的C#表达式来检索对象,您仍然可以使用它来初始化一些代码隐藏资源。但是,请注意,以上述方式进行操作时,通过表达式,画笔也可以直接在任何XAML中使用"{StaticResource beveledLinearGradientBrush}"
。
例如:
<Border Background="{StaticResource beveledLinearGradientBrush}"/>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句