WPF 中托管 UWP

摘要:
托管标准UWP控件1.新建空白应用项目,确保目标版本和最低版本均设置为Windows10版本1903或更高版本。大多数XAML岛方案在面向任何CPU的项目中不受支持  6.在WPF项目中,添加对UWP应用项目的引用7.将WPF程序的默认入口更改为新Program类的Main方法publicclassProgram{[System.STAThreadAttribute()]publicstaticvoidMain(){using{MyWPFApp.Appapp=newMyWPFApp.App();app.InitializeComponent();app.Run();}}}8.现已将项目配置为使用UWPXAML岛,接下来可以将InkCanvas和InkToolbar包装的UWP控件添加到应用了。通常在UWP类库项目中定义自定义控件,以便于移植。

托管标准 UWP 控件

1. 新建空白应用(通用 Windows)项目,确保目标版本和最低版本均设置为 Windows 10 版本 1903 或更高版本。在 UWP 应用项目中,安装Microsoft.Toolkit.Win32.UI.XamlApplication

2. 修改App的默认基类为XamlApplication

<xaml:XamlApplication
    ...
    xmlns:xaml="using:Microsoft.Toolkit.Win32.UI.XamlHost"...>

</xaml:XamlApplication>
    sealed partial class App //: Application

3. 从 UWP 应用项目中删除OnLaunched方法,或者删除 MainPage.xaml 文件

以上目的是提供Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication类的实例,供WPF使用

4. 创建 WPF 应用 ,安装Microsoft.Toolkit.Wpf.UI.Controls,此包提供使用适用于 WPF 的已包装 UWP 控件所需的所有内容(包括InkCanvasInkToolbarWindowsXamlHost控件。

5. 将解决方案配置为面向特定平台,例如 x86 或 x64。大多数 XAML 岛方案在面向任何 CPU 的项目中不受支持  

WPF 中托管 UWP第1张

6.在 WPF 项目中,添加对 UWP 应用项目的引用

7. 将WPF程序的默认入口更改为新Program类的Main方法

public classProgram
{
    [System.STAThreadAttribute()]
    public static voidMain()
    {
        using (newMyUWPApp.App())
        {
            MyWPFApp.App app = newMyWPFApp.App();
app.InitializeComponent(); app.Run(); } } }

8.现已将项目配置为使用 UWP XAML 岛,接下来可以将InkCanvasInkToolbar包装的 UWP 控件添加到应用了。

xmlns:Controls="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls"

<Controls:InkToolbar x:Name="myInkToolbar"TargetInkCanvas="{x:Reference myInkCanvas}"Grid.Row="0"Width="300"Height="50"Margin="10,10,10,10"HorizontalAlignment="Left"VerticalAlignment="Top" />
    <Controls:InkCanvas x:Name="myInkCanvas"Grid.Row="1"HorizontalAlignment="Left"Width="600"Height="400"Margin="10,10,10,10"VerticalAlignment="Top" />

9.默认情况下,仅为数字笔启用 InkCanvas 控件。不过,你可以更改此行为。

publicMainWindow()
        {
            InitializeComponent();

            this.myInkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse |CoreInputDeviceTypes.Touch;
}

还可以使用WindowsXamlHost控件将CalendarView添加到应用中

xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"

<xamlhost:WindowsXamlHost x:Name="myCalendar"InitialTypeName="Windows.UI.Xaml.Controls.CalendarView"Grid.Row="2"Margin="10,10,10,10"Width="600"Height="300"ChildChanged="MyCalendar_ChildChanged"  />
private void MyCalendar_ChildChanged(objectsender, EventArgs e)
{
    WindowsXamlHost windowsXamlHost =(WindowsXamlHost)sender;

    Windows.UI.Xaml.Controls.CalendarView calendarView =(Windows.UI.Xaml.Controls.CalendarView)windowsXamlHost.Child;

    if (calendarView != null)
    {
        calendarView.SelectedDatesChanged += (obj, args) =>{
            if (args.AddedDates.Count > 0)
            {
                MessageBox.Show("The user selected a new date: " +args.AddedDates[0].DateTime.ToString());
            }
        };
    }
}

托管自定义 UWP 控件

只有 WPF 应用(.NET Core) 支持托管自定义UWP

要在 WPF 应用中托管自定义 UWP 控件,必须有此控件的源代码,才能通过应用对其进行编译。通常在 UWP 类库项目中定义自定义控件,以便于移植。

1. 修改UWP的App.xaml.cs 文件

publicApp()
        {
            //this.InitializeComponent();
            //this.Suspending += OnSuspending;
            this.Initialize();
        }

2. 新建一个“类库(通用 Windows)” 项目,确保目标版本和最低版本均设置为 Windows 10 版本 1903 或更高版本 。

3. 修改类库的项目文件,在结尾的</Project>元素前面,添加以下 XML,以禁用多个属性,然后保存项目文件。

<PropertyGroup>
  <EnableTypeInfoReflection>false</EnableTypeInfoReflection>
  <EnableXBindDiagnostics>false</EnableXBindDiagnostics>
</PropertyGroup>

4. 假设此用户控件的内容如下

<StackPanel Background="LightCoral">
    <TextBlock>This is a simple custom UWP control</TextBlock>
    <Rectangle Fill="Blue"    />
    <TextBlock Text="{x:Bind XamlIslandMessage}" FontSize="50"></TextBlock>
</StackPanel>
public sealed partial classMyUserControl : UserControl
{
    public string XamlIslandMessage { get; set; }

    publicMyUserControl()
    {
        this.InitializeComponent();
    }
}

5. 生成该类库,添加引用到WPF项目中。同时将类库引用添加到UWP应用项目中

6. 在WPF中添加

        <xamlhost:WindowsXamlHost InitialTypeName="ClassLibrary1.MyUserControl1" ChildChanged="WindowsXamlHost_ChildChanged" />
        private void WindowsXamlHost_ChildChanged(objectsender, EventArgs e)
        {
            global::Microsoft.Toolkit.Wpf.UI.XamlHost.WindowsXamlHost windowsXamlHost =sender as global::Microsoft.Toolkit.Wpf.UI.XamlHost.WindowsXamlHost;
            global::ClassLibrary1.MyUserControl1 userControl =windowsXamlHost.GetUwpInternalObject() as global::ClassLibrary1.MyUserControl1;

            if (userControl != null)
            {
                userControl.XamlIslandMessage = "Binding from WPF to UWP XAML";
            }
        }

将 WinUI 库中的控件添加到自定义控件

如果桌面应用在MSIX 包中打包,则可以使用Microsoft.UI.XamlNugGet 包的预发行版本或发行版本。如果桌面应用未使用 MSIX 打包,则必须安装Microsoft.UI.XamlNuGet 包的预发行版本。

最好使用预发行版本

1. 在UWP应用和类库项目中都安装Microsoft.UI.Xaml

2. 在UWP应用项目App.xaml中添加

<Application.Resources>
    <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
</Application.Resources>

添加到 ResourceDictionary 的资源的顺序会影响它们的应用顺序。XamlControlsResources字典会重写许多默认的资源键,因此应先将其添加到Application.Resources,使之不会在应用中重写任何其他自定义样式或资源。

3. 在类库项目中添加声明xmlns:winui="using:Microsoft.UI.Xaml.Controls",和控件

<UserControl
    x: 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ClassLibrary1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:winui="using:Microsoft.UI.Xaml.Controls"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">
<StackPanel Background="LightCoral">
    <TextBlock>This is a simple custom UWP control</TextBlock>
    <Rectangle Fill="Blue"    />
    <TextBlock Text="{x:Bind XamlIslandMessage}" FontSize="50"></TextBlock>
    <winui:RatingControl />
</StackPanel>

打包应用

对于WinUI宿主,如果没有安装预发行版本,则必须在MSIX 包中打包 WPF 应用

  1. 向解决方案中添加一个新的Windows 应用程序打包项目创建项目时,针对“目标版本”和“最低版本”选择“Windows 10 版本 1903 (10.0;版本 18362)” 。

  2. 在打包项目中,右键单击“应用程序”节点,然后选择“添加引用” 。在项目列表中,选择解决方案中的 WPF 项目,然后单击“确认” 。

  3. 编辑此 WPF 项目文件。若要打包托管自定义 UWP 控件的 WPF 应用,目前需要完成以下更改。

    1. 在“解决方案资源管理器”中右键单击 WPF 项目节点,然后选择“卸载项目”。

    2. 右键单击 WPF 项目节点,选择“编辑”。

    3. 找到文件的最后一个</PropertyGroup>结束标记,紧随该标记之后添加以下 XML。

      XML
      <PropertyGroup>
        <AssetTargetFallback>uap10.0.18362</AssetTargetFallback>
      </PropertyGroup>
      
    4. 保存并关闭项目文件。

    5. 右键单击 WPF 项目节点,选择“重新加载项目”。

  4. 生成并运行打包项目。确认 WPF 按预期运行,并且 UWP 自定义控件按预期方式显示。

免责声明:文章转载自《WPF 中托管 UWP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OCR2:tesseract字库训练NSIS逻辑函数头文件介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编程王道,唯“慢”不破

原文地址 人和人之间编程速度的差异还是很大的,有的程序猿写代码非常快,有的却常常是龟速。Jeffrey Ventrella 最近在一篇文章里探讨了这种编程速度的差异,他是绝对的龟速派代表,来看看他对编程速度的看法: 我爸常跟我说的一句话是,慢一点码,才能快点把程序写完。 我在旧金山很多家互联网公司工作过,现在已经 52 岁了,对于程序猿这个职业来说,我的年...

Alfresco安装与配置图解

Alfresco安装与配置图解 Alfresco是一款开源的企业内容管理系统(ECM),为企业提供了日常的文档管理、工作流(可以和企业目前的OA协同接合使用)、工作记录管理、知识管理、网络内容管理、图片管理等多种功能,所以从功能山观看,相当于MS的sharepoint,目前alfresco对于中文支持的比以前也有了相当的改进。另外,它的架构非常的清晰,功能...

uiautomatorviewer详解

一,uiautomatorviewer是什么?     Android 4.1发布的,uiautomator是用来做UI测试的。也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期。比如 登陆界面 分别输入正确和错误的用户名密码然后点击登陆按钮看看是否能否登陆以及是否有错误提示等。 功能性或者黑盒UI测试不需要测试人员了解程序如何实现的,只需...

WPF笔记(3)TreeView

TreeView表示的是层次化结构(hierarchical)数据。TreeView的每一项称为TreeViewItem。TreeViewItem既可以被定义成一个字符串,也可以是一个嵌套的Item对象集合。TreeView的类层次结构如下: ControlItemsControlHeaderedItemsControlMenuItemToolBarTre...

初识iOS9 iPad新特性SlideView和SplitView的适配

苹果刚发布了iOS9,在iPad上新增了两个新的特性SlideView和SplitView,前者可以在不关闭当前激活APP的情况下调出来另外个APP以30%比例显示进行操作使用,后者允许同时运行两个APP以50%50%,70%30%比例运行,感觉非常方便。 然而,方便了用户的同时却恶心了开发者,在同一屏幕运行两种APP的时候势必APP显示比例发生改变,那么...

部署水晶报表的打包安装

  有水晶报表的程序打包时还需要做的事项: 参考网站:http://community.csdn.net/Expert/topic/3770/3770083.xml?temp=.9249536 安装部署时,把水晶报表的msm打进去,注册到服务器要部署使用 Crystal Reports for Visual Studio .NET 2003 的程序; 首先...