"XamlParseException в библиотеке классов UWP dll - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю над универсальной библиотекой классов, предназначенной для использования приложений UWP.

В этом я пытаюсь использовать Content Dialog, чтобы получить какой-либо пользовательский ввод.

Все хорошо работает в отладке, когда я упаковываю свою библиотеку как dll и распространяю, ContentDialog не отображается из приложения, которое ссылается на мою dll.

Я получаю Windows.UI.Xaml.Markup.XamlParseException: XAML parsing failed исключение, я получил это через файл журнала.

Здесь мой код

ContentDialog

<ContentDialog
x:Class="xxxx.yyyy.InputContentDialogue"
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"
mc:Ignorable="d"
x:Name="dialog"
Title="Title">

<ContentDialog.Resources>
    <Style x:Name="ButtonStyleNoTabFocus" TargetType="Button">
        <Setter Property="FocusVisualPrimaryBrush" Value="Transparent" />
        <Setter Property="Margin" Value="5"/>
    </Style>
</ContentDialog.Resources>

<!-- Content body -->
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="0,20" MinWidth="550">

    <StackPanel Orientation="Vertical">

        <TextBlock  TextWrapping="WrapWholeWords" Margin="5,0,0,10">
       shkgdsakjfdhgsajkfdhkasd sadkfjahsdkj asdfjasfdja asdkfjasdf asdkjfnas asdkjfnasd
        </TextBlock>

        <TextBlock Margin="5,0,0,10">sjkdhfkjsdf sdajfakjdsb sadfkajsdfa.
        </TextBlock>

        <StackPanel Orientation="Horizontal">
            <Button  TabIndex="0" 
                 HorizontalAlignment="Center" 
                 Content="hey there"
                 Style="{StaticResource ButtonStyleNoTabFocus}" 
                 x:Name="btn1" 
                 Click="btn1_Click" 
                 GotFocus="Btn_GotFocus"
                 LostFocus="Btn_LostFocus"/>
            <Button  HorizontalAlignment="Center" 
                 Content="Hi" 
                 x:Name="btn2" 
                 Style="{StaticResource ButtonStyleNoTabFocus}" 
                 Click="btn2_Click"
                 GotFocus="Btn_GotFocus"
                 LostFocus="Btn_LostFocus"/>
            <Button  HorizontalAlignment="Center" 
                 Content="Hello" 
                 Style="{StaticResource ButtonStyleNoTabFocus}" 
                 x:Name="btn3" 
                 Click="btn3_Click" 
                 GotFocus="Btn_GotFocus"
                 LostFocus="Btn_LostFocus"/>
        </StackPanel>
    </StackPanel>
</Grid>

ContentDialog.cs

public sealed partial class InputContentDialogue : ContentDialog
{

    public UserConsentContentDialogue()
    {
        this.InitializeComponent();
        this.Result = -1;
        this.Closing += ContentDialogue_Closing;
    }


    private void ContentDialogue_Closing(ContentDialog sender, ContentDialogClosingEventArgs args)
    {
        if (args.Result == ContentDialogResult.None && this.Result == -1)
        {
            args.Cancel = true;
        }
    }

    public int Result { get; set; }


    // Handle the button clicks from dialog
    private void btn1_Click(object sender, RoutedEventArgs e)
    {

        this.Result = 0;
        // Close the dialog
        dialog.Hide();
    }

    private void btn2_Click(object sender, RoutedEventArgs e)
    {
        this.Result = 1;
        // Close the dialog
        dialog.Hide();
    }

    private void btn3_Click(object sender, RoutedEventArgs e)
    {
        this.Result = 2;
        // Close the dialog
        dialog.Hide();
    }

    private void Btn_GotFocus(object sender, RoutedEventArgs e)
    {
        Brush _blinkBrush = Application.Current.Resources["SystemControlHighlightAccentBrush"] as SolidColorBrush;
        (sender as Button).BorderBrush = _blinkBrush;
    }

    private void Btn_LostFocus(object sender, RoutedEventArgs e)
    {
        (sender as Button).BorderBrush = new SolidColorBrush(Colors.Transparent);
    }
}

И я создаю новый экземпляр и пытаюсь показать диалоговое окно, вот так

 internal static async Task<int> ShowMyContentDialog()
    {
        try
        {
            InputContentDialogue dialogue = new InputContentDialogue();

            await dialogue.ShowAsync();

            return dialogue.Result;
        }
        catch(Exception e)
        {
            FileOperations.WriteToLogFile("ERROR occurred "+ e.ToString());
        }
        return -1;
    }

Все работает хорошо, если я ссылаюсь на эту библиотеку в базе кода. Если я получаю релиз dll и ссылаюсь на него из тестового приложения, я получаю исключение xaml parse.

Может ли кто-нибудь помочь мне в этом.

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

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Все работает хорошо, если я ссылаюсь на эту библиотеку в базе кода. Если я получаю релиз dll и ссылаюсь на него из тестового приложения, я получаю исключение xaml parse.

Отличный вопрос, проблема в том, что ваш dll файл отсутствует Xaml Content . Когда вы компилируете dll с файлом xaml в нем, он будет записан в файлы xxxx.xr. xml, и эти файлы также должны быть скопированы в каталог bin ( НО НЕ ОБЪЯВЛЯЕТСЯ папка ) вашего приложения с относительным путем. После сборки библиотеки классов проверьте, не содержит ли папка bin папки ресурсов dll, pdb, pri и dll, как показано ниже.

Для тестирования это будет работать, если вы непосредственно добавите файл dll в папку bin библиотеки классов к вашей ссылке на проект.

enter image description here

0 голосов
/ 06 апреля 2020

Наконец, я нашел решение.

Спасибо @Nico за ответ, он почти ответил на вопрос.

Вот ссылка, которая дает вам четкое представление о проблеме

Отсутствует xaml.xr файла библиотеки классов в UWP

Шаги

1) Установите флажок «Создать макет библиотеки» в свойствах вашего проекта enter image description here

2) При копировании dll из папки bin / release, скопируйте эти файлы тоже

  • ClassLibrary1 (имя библиотеки классов) Папка

    1. ClassLibrary1.xr. xml

      2.UserControl.xaml (файл UserControl XAML)

  • ClassLibrary1 .dll

  • ClassLibrary1.pri

Храните все эти файлы в той же папке, где вы храните свою библиотеку DLL.

Просто отошлите свою библиотеку dll в одиночку к проекту Referrer.

Все остальные файлы будут автоматически переданы.

...