【问题标题】:How to add xbf files to visual studio project如何将 xbf 文件添加到 Visual Studio 项目
【发布时间】:2019-04-24 22:57:59
【问题描述】:

我已经为 Windows 通用平台(Win 10 UWP)创建了一个类库。

该库包含一些用户控件。

当我将此库中的 dll 添加到 Win 10 UWP 应用程序并使用 UserControls 时,它会给出 XamlParseException,如 here in another question I posted 所述

但是当我引用整个项目时,没有例外,我可以使用 UserControl。这可能是因为当我只是引用 dll 文件时,有一些 xbf 文件没有添加到 Win 10 应用程序项目中。

在某个项目中,我需要手动将xbf文件添加到Win 10 app项目中,无法引用整个项目,只能引用dll并添加需要的文件。

我尝试在 Visual Studio 项目中创建一个文件夹并添加 xbf 文件,还尝试创建具有不同名称的文件夹并通过 Windows 资源管理器将 xbf 文件复制到“bin”目录中。但没有成功。

那么,如何手动将 xbf 文件添加到 Windows 10 UWP 项目?

更新 1 :- XAML 和代码供参考

public sealed partial class CustomPopupControl : UserControl
{
    internal CustomPopupControl()
    {
        this.InitializeComponent();    //-------CRASHES HERE-------
    }

    internal CustomPopupControl() : base()
    {
        Debug.WriteLine("CustomPopupControl");
        //
        //do some stuff
        //
        //
    }

    private void OnPopupLoaded(object sender, RoutedEventArgs e)
    {
        this.Popup_Container.HorizontalOffset = (Window.Current.Bounds.Width - Grid_Child.ActualWidth) / 2;
        this.Popup_Container.VerticalOffset = (Window.Current.Bounds.Height - Grid_Child.ActualHeight) / 2;
    }

    internal void OpenPopup()
    {
        Debug.WriteLine("OpenPopup");
        Popup_Container.IsOpen = true;

        var currentFrame = Window.Current.Content as Frame;
        var currentPage = currentFrame.Content as Page;
        currentPage.IsHitTestVisible = false;

        Debug.WriteLine("OpenPopup Done");
    }

    private void OnLayoutUpdated(object sender, object e)
    {
        if (Grid_Child.ActualWidth == 0 && Grid_Child.ActualHeight == 0)
        {
            return;
        }

        double ActualHorizontalOffset = Popup_Container.HorizontalOffset;
        double ActualVerticalOffset = Popup_Container.VerticalOffset;

        double NewHorizontalOffset = (Window.Current.Bounds.Width - Grid_Child.ActualWidth) / 2;
        double NewVerticalOffset = (Window.Current.Bounds.Height - Grid_Child.ActualHeight) / 2;

        if (ActualHorizontalOffset != NewHorizontalOffset || ActualVerticalOffset != NewVerticalOffset)
        {
            Popup_Container.HorizontalOffset = NewHorizontalOffset;
            Popup_Container.VerticalOffset = NewVerticalOffset;
        }
    }
}

XAML:-

<UserControl
x:Class="MyLibrary.CustomPopupControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyLibrary"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Popup Name="Popup_Container" LayoutUpdated="OnLayoutUpdated">
    <Border BorderThickness="1" BorderBrush="{ThemeResource AppBarBorderThemeBrush}">
        <Grid Name="Grid_Child">
            <Grid Name="Grid_Content"  Height="300" Width="400" />
        </Grid>
    </Border>
</Popup>

我直接在另一个应用程序中使用该控件,因为 -

CustomPopupControl myctrl = new CustomPopupControl();
myctrl.OpenPopup();

【问题讨论】:

  • 你的问题解决了吗?

标签: c# windows-8 windows-store-apps windows-10 win-universal-app


【解决方案1】:

除了Thomas的回答,还需要在项目的Properties页面下的Build configuration中勾选“Generate library layout”选项。

我们需要参考的文件:

  • ClassLibrary1(类库名称)文件夹
    • ClassLibrary1.xr.xml
    • CustomPopupControl.xaml
  • ClassLibrary1.dll
  • ClassLibrary1.pri -> 包资源索引文件

将这些文件复制到任何地方,UWP项目只需在Visual Studio中添加对ClassLibrary1.dll文件的引用,它们都会自动添加。

当我尝试在“InitializeComponent()”方法上使用 UserControl 时,它只会引发 xaml 解析异常

添加引用时可能缺少 .pri 文件。

【讨论】:

  • 谢谢!我自己无法解决这个问题!我从来没有在互联网上的任何地方找到任何接近这个解决方案的东西。有什么资源可以指点我吗?
  • Generate library out 在我的情况下是灰色的。如何解决这个问题?我不明白你打算做什么。
  • @franklin 我禁用了“生成库布局”选项。我能做什么?
【解决方案2】:

尝试将您的构造函数定义为公共的而不是内部的。

另外,您的第二个构造函数正在调用 base,但如果它不需要任何参数,我不确定您为什么拥有/需要它。

试试这个代码:

public sealed partial class CustomPopupControl : UserControl
{
    public CustomPopupControl()
    {
        this.InitializeComponent();    

        Debug.WriteLine("CustomPopupControl");
    }

    private void OnPopupLoaded(object sender, RoutedEventArgs e)
    {
        this.Popup_Container.HorizontalOffset = (Window.Current.Bounds.Width - Grid_Child.ActualWidth) / 2;
        this.Popup_Container.VerticalOffset = (Window.Current.Bounds.Height - Grid_Child.ActualHeight) / 2;
    }

    internal void OpenPopup()
    {
        Debug.WriteLine("OpenPopup");
        Popup_Container.IsOpen = true;

        var currentFrame = Window.Current.Content as Frame;
        var currentPage = currentFrame.Content as Page;
        currentPage.IsHitTestVisible = false;

        Debug.WriteLine("OpenPopup Done");
    }

    private void OnLayoutUpdated(object sender, object e)
    {
        if (Grid_Child.ActualWidth == 0 && Grid_Child.ActualHeight == 0)
        {
            return;
        }

        double ActualHorizontalOffset = Popup_Container.HorizontalOffset;
        double ActualVerticalOffset = Popup_Container.VerticalOffset;

        double NewHorizontalOffset = (Window.Current.Bounds.Width - Grid_Child.ActualWidth) / 2;
        double NewVerticalOffset = (Window.Current.Bounds.Height - Grid_Child.ActualHeight) / 2;

        if (ActualHorizontalOffset != NewHorizontalOffset || ActualVerticalOffset != NewVerticalOffset)
        {
            Popup_Container.HorizontalOffset = NewHorizontalOffset;
            Popup_Container.VerticalOffset = NewVerticalOffset;
        }
    }
}

谢谢,

【讨论】:

  • 当我尝试在“InitializeComponent()”方法上使用 UserControl 时,它只会引发 xaml 解析异常。它还提供 NullReferenceException 作为使用该库的应用程序中的外部异常。我以前通过库使用过 UserControls,并且从来没有生成或需要任何 xbf 文件,至少在 WP8 中是这样。 Windows 10 UWP 平台发生了这种情况。我可以不直接通过代码使用用户控件 - 不在 xaml 中添加它们,而是动态创建它们?如果是这样,如果我引用该项目,为什么它会起作用??
  • 我发布的代码被简化了。第二个构造函数确实有一些参数。无论如何,请检查我选择作为解决方案的@FranklinChen 的答案。
猜你喜欢
  • 2011-03-04
  • 2012-12-08
  • 1970-01-01
  • 2014-08-24
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2012-07-15
相关资源
最近更新 更多