如何解析具有自定义类的xaml文件,以获取所有对象的列表?

时间:2011-10-27 23:38:02

标签: xaml xamlparseexception xamlreader

我经历了大量类似的帖子,但似乎没有任何工作在我的情况下。我想要做的就是加载一个xaml文件(位于其他一些程序集中),并遍历不同的元素/对象以检查某个属性值。 我可以把它读作一个简单的XML文件,但是像样式等的东西不能通过xml解析来捕获。 经过大量搜索,我尝试了以下两件事:

  1. 我从xaml中删除了x:Class=".." 我还在其中添加了assembly=XBase.UI(因为我的原始xaml没有这个,我读到在动态加载时,你需要知道指定程序集) 然后我将剩余的文件作为xml流加载。 然后我调用了XamlReader.Load(stream)
  2. 这似乎适用于发布查询的人,但我得到了异常

    'System.Windows.Markup.XamlParseException : 'The invocation of the constructor on type 'XBase.UI.XControlBase' that matches the specified binding constraints threw an exception.' Line number '6' and line position '55'.
      ----> System.InvalidOperationException : The calling thread must be STA, because many UI components require this.'
    

    我尝试的第二件事是使用XamlReader.Parse并提供ParserContext。    这就是我所做的:

       var context = new ParserContext();
       context.XamlTypeMapper = new XamlTypeMapper(new string[] { });
       context.XamlTypeMapper.AddMappingProcessingInstruction("UI", "XBase.UI", ""); //assemblyname is empty as my original file doesn't have one
       context.XmlnsDictionary.Add("UI", "clr-namespace:XBase.UI;assembly=XBase.UI");
       string text = File.ReadAllText(xamlfile);
       var object = XamlReader.Parse(xamlfile, context);
    

    这也引发了异常:

    'System.Windows.Markup.XamlParseException : 'Cannot create unknown type '{clr-namespace:XBase.UI}XControlBase'.' Line number '1' and line position '2'.
      ----> System.Xaml.XamlObjectWriterException : 'Cannot create unknown type '{clr-namespace:XBase.UI}XControlBase'.' Line number '1' and line position '2'.'
    

    我的原始xaml文件

    <UI:XControlBase x:Class="XBase.UI.XListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:UI="clr-namespace:XBase.UI" Height="Auto" Width="Auto" IsTabStop="False"
    mc:Ignorable="d"
    Visibility="{Binding IsVisible, Converter={StaticResource VisibilityConverter}}">
    <UI:XControlBase.Resources>
        <UI:ButtonTemplateSelector x:Key="ButtonSelector" />
    </UI:XControlBase.Resources>
    <UI:ItemControlWrapper  
        ItemsSource="{Binding ButtonList}" 
        ItemTemplateSelector="{StaticResource ButtonSelector}" 
        IsTabStop="False">
        <UI:ItemControlWrapper.ItemsPanel>
            <ItemsPanelTemplate >
                <StackPanel Orientation="{Binding ListOrientation}" />
            </ItemsPanelTemplate>
        </UI:ItemControlWrapper.ItemsPanel>
    </UI:ItemControlWrapper>
    </UI:XControlBase>
    

    请帮帮我。我甚至不确定这是否是实现我想要的正确方法。如果有另一种方法可以以更有意义的方式列出某种类型的所有元素,而不是 XmlDocument的GetElementsByTagName,请告诉我。

    提前致谢!

0 个答案:

没有答案