是否可以在 Uno 项目中使用 Xamarin Forms 控件?
Posted
技术标签:
【中文标题】是否可以在 Uno 项目中使用 Xamarin Forms 控件?【英文标题】:Is it possible to use Xamarin Forms Controls in a Uno project? 【发布时间】:2021-03-29 23:33:12 【问题描述】:我目前正在使用 Uno 和 WinUI 3 开发一个跨平台(Windows 和 Mac)应用程序。我需要在我的项目中实现一个 WebView
,但我遇到了一些麻烦。
在 Windows 上,我可以毫无问题地使用来自 WinUI 的新 WebView2
,但不受 Uno 支持,我无法在 Mac 上使用它。在 Mac 上,我认为我什至不能使用 WebView1
,因为 WinUI 3 不再支持它(在 Uno.WinUI 中也是如此,还是我错了?)。
所以我想在 Mac 上使用 Xamarin.Forms WebView
,但我不知道如何实现它。我想用 WebView
向解决方案添加一个新项目,然后从 Uno.Mac 项目中调用它,但它不起作用。
你能给我一些建议吗?
【问题讨论】:
嗨,这似乎是不可能实现的。基于 UWP 的 Uno 项目,和using Windows.UI.Xaml.Controls;
设计用户界面。除非你可以在里面引用Xamarin.Forms
包。
我刚刚创建了一个 PR 来修复 macOS 上的 WebView
控件。它应该很快被合并,所以最新的预览包应该正确支持它github.com/unoplatform/uno/pull/5041
【参考方案1】:
可以在 Xamarin.Forms 应用中使用 Uno 平台控件(请参阅 docs)。另一种方式也可能是因为was a way 在本机应用程序中嵌入 Xamarin.Forms 控件,而 Uno 允许嵌入本机控件(请参阅 docs)。
但是,更有效的解决方案是使用 Uno Platform 提供的内置 WebView
控件(除非它缺少您需要的某些功能 - 在这种情况下,请在 GitHub 上提出问题 :-))。
或者,您也可以直接嵌入原生 macOS WKWebView
(使用上面链接的步骤)并直接使用它。
【讨论】:
您是否尝试过在 Uno 平台应用程序中为各种目标使用 Xamarin.Forms 控件?或者你可能有什么例子?我目前正在试验这些可能性,以便非常方便。 很遗憾不是个人,但如果您在 Discord 上加入 Uno Platform,您几乎可以实时询问团队 :-) platform.uno/blog/… 我加入了discord频道并提出了问题,希望能得到一些答案。【参考方案2】:Xamarin.Forms 控件不能在 Uno 应用中单独使用,就像那些不能在 Xamarin.ios 或 Xamarin.android“经典”应用中使用一样。
但是,您可以使用 in this article 中描述的 Xamarin.Forms 嵌入技术。该技术的基础是创建一个ContentPage
,然后将其添加为本机控件。
Uno Platform 支持通过使用代码隐藏将本机视图分配给 ContentControl
的 Content
属性直接在可视树中添加本机控件。
【讨论】:
【参考方案3】:您可以轻松地将 Xamarin 内容添加到 uno 中,反之亦然。
试试这个:
public partial class XamarinContent : ContentControl
View _element;
public View Element
get => _element;
set
_element = value;
#if __ANDROID__
var renderer = RendererFactory.GetRenderer(value);
this.Content = renderer.View;
this.SizeChanged += (s, a) =>
_element.Layout(new Rect(0, 0, a.NewSize.Width, a.NewSize.Height));
;
#else
var converter = new ViewToRendererConverter();
var frameworkElement = converter.Convert(value, null, null, null);
this.Content = frameworkElement;
// this.SetValue(ContentControl.ContentProperty, frameworkElement) ;
#endif
并从 uno 转换为 Xamarin 形式
[ContentProperty("Element")]
public class UnoContent : Xamarin.Forms.TemplatedView
public static readonly BindableProperty ContentProperty
= BindableProperty.Create("Element", typeof(Windows.UI.Xaml.FrameworkElement), typeof(View), null);
public Windows.UI.Xaml.FrameworkElement Element
get return (Windows.UI.Xaml.FrameworkElement)GetValue(ContentProperty);
set SetValue(ContentProperty, value); base.ControlTemplate = new Xamarin.Forms.ControlTemplate(() => value.ToView());
【讨论】:
以上是关于是否可以在 Uno 项目中使用 Xamarin Forms 控件?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在Xamarin项目中更改System.Runtime的版本?
是否可以在支持所有平台的 Uno 平台上使用 Blend for Visual Studio?