我已经为Windows Universal Platform(Win 10 UWP)创建了一个类库。
该库包含一些UserControls。
当我将此库中的dll添加到Win 10 UWP应用程序并使用UserControls时,它会产生一个XamlParseException,如所述here in another question I posted
但是当我引用整个项目时,没有异常,我可以使用UserControl。这可能是因为当我引用dll文件时,有些xbf文件未添加到Win 10应用程序项目中。
在某个项目中,我需要手动将xbf文件添加到Win 10应用程序项目中,我无法引用整个项目,我只能引用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();
答案 0 :(得分:4)
除了Thomas的答案之外,您还需要在项目的“属性”页面下的“构建”配置中选中“生成库布局”选项。
我们需要引用的文件:
将这些文件复制到任何地方,UWP项目只需要在Visual Studio中添加对ClassLibrary1.dll文件的引用,所有这些文件都将自动添加。
当我尝试在“InitializeComponent()”方法上使用UserControl时,它只抛出一个xaml解析异常
添加引用时,可能缺少 .pri 文件。
答案 1 :(得分:-2)
尝试将构造函数定义为public而不是internal。
此外,你的第二个构造函数正在调用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;
}
}
}
谢谢,