2

我正在尝试使用 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 的任何帮助将不胜感激。

4

1 回答 1

4

要回答您的具体问题,需要在编译 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}"/>
于 2015-03-12T11:44:36.487 回答