“ UWP类库dll中的XamlParseException

问题描述 投票:0回答:2

我正在开发一个通用类库,旨在使用UWP应用。

在此尝试使用“内容对话框”获得一些用户输入。

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

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

谁能在这方面帮助我。

提前感谢。

c# xaml dll uwp xamlparseexception
2个回答
1
投票

如果我在代码库中引用此库,则一切正常。如果我获得版本dll并从测试应用程序中引用它,则将得到xaml解析异常。

很好的问题,问题在于您的dll文件缺少Xaml内容。当您在其中编译带有xaml文件的dll时,它将被记录到xxxx.xr.xml文件中,并且这些文件也必须被复制到以下目录的bin目录(但不是Obj文件夹)您的应用具有相对路径。生成类库后,请检查bin文件夹是否包含dll,pdb,pri和dll资源文件夹,如下所示。

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

enter image description here


0
投票

最后,我找到了解决方法。

感谢@Nico的回答,它几乎回答了问题。

这里是让您清楚了解该问题的链接

Missing xaml.xr of a class library file in UWP

步骤

1)在项目属性中选中“生成库布局”enter image description here

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

  • ClassLibrary1(类库名称)文件夹

    1. ClassLibrary1.xr.xml

      2.UserControl.xaml(UserControl XAML文件)

  • ClassLibrary1.dll

  • ClassLibrary1.pri

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

仅将您的库dll单独引用到引荐来源项目。

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

© www.soinside.com 2019 - 2024. All rights reserved.