Как проанализировать файл xaml, имеющий пользовательский класс, чтобы получить список всех объектов?

#xaml #xamlparseexception #xamlreader

#xaml #xamlparseexception #xamlreader

Вопрос:

Я просмотрел множество похожих сообщений, но, похоже, в моем случае ничего не работает. Все, что я хочу сделать, это загрузить файл xaml (расположенный в какой-либо другой сборке) и выполнить итерацию по различным элементам / объектам для проверки определенного значения атрибута. Я мог бы прочитать его как простой XML-файл, но такие вещи, как стили и т. Д., Не Могут быть обнаружены с помощью синтаксического анализа xml. После долгих поисков я попробовал следующие две вещи:

  1. Я удалил x:Class=".." из xaml, я также добавил assembly=XBase.UI в это (поскольку в моем исходном xaml этого не было, и я прочитал, что при динамической загрузке вам нужно знать, укажите сборку), затем я загрузил оставшийся файл в виде потока xml. Затем я вызвал XamlReader.Загрузка (поток)

Кажется, это работает для людей, которые отправили запросы, но я получаю исключение

 '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.Проанализируйте и предоставьте 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>
 

Пожалуйста, помогите мне здесь. Я даже не уверен, что это правильный способ достичь того, чего я хочу. Если есть другой способ перечислить все элементы определенного типа более осмысленным способом
, отличным от getElementsByTagName XmlDocument, пожалуйста, дайте мне знать.

Заранее спасибо!

Комментарии:

1. Сейчас у меня тоже есть эта проблема.