是否可以在 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 支持通过使用代码隐藏将本机视图分配给 ContentControlContent 属性直接在可视树中添加本机控件。

【讨论】:

【参考方案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 控件?的主要内容,如果未能解决你的问题,请参考以下文章

Platform.Uno介绍

是否可以在 Xamarin 表单中使用图像集

是否可以在Xamarin项目中更改System.Runtime的版本?

是否可以在支持所有平台的 Uno 平台上使用 Blend for Visual Studio?

如何在 xamarin 表单共享项目中检查 Internet 连接

是否可以在 Xamarin iOS/Android 中使用定义 PCL 的 RESX 文件来支持多语言?