“UWP class 库 dll 中的 XamlParseException

"XamlParseException in UWP class library dll

我正在开发通用 class 库,旨在使用 UWP 应用程序。

在此尝试使用内容对话框获​​取一些用户输入。

在调试中一切正常,当我将我的库打包为 dll 并分发时,ContentDialog 没有从引用我的 dll 的应用程序中显示。

我收到 Windows.UI.Xaml.Markup.XamlParseException: XAML parsing failed 异常,我是通过日志文件得到的。

这是我的代码

内容对话框

<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 解析异常。

任何人都可以帮助我。

提前致谢。

Everything works good , if I refer this library in code base. If I get release dll and refer it from a test app, am getting the xaml parse exception.

问得好,问题是你的 dll 文件缺少 Xaml 内容。当你编译一个包含xaml文件的dll时,它会被记录到xxxx.xr.xml个文件中,这些文件也必须复制到bin目录中( 但不是您的应用程序的 Obj 文件夹),具有相对路径。构建class库后,请检查bin文件夹是否包含dll、pdb、pri和dll资源文件夹,如下所示。

对于测试,如果您直接将 class 库 bin 文件夹中的 dll 文件添加到您的项目引用中,它将起作用。

终于,我找到了解决办法。

感谢@Nico 的回答,问题差不多就解决了

这是 link,它让您清楚地了解问题

步数

1) 在您的项目属性中检查 "Generate library layout"

2) 从 bin/release 文件夹复制你的 dll 时,也复制这些文件

  • Class库1(Class库名)文件夹

    1. ClassLibrary1.xr.xml

      2.UserControl.xaml(用户控件 XAML 文件)

  • ClassLibrary1.dll

  • ClassLibrary1.pri

将所有这些文件保存在您保存库 dll 的同一文件夹中。

只需将您的库 dll 单独引用到引用项目。

将自动引用所有其他文件。