【问题标题】:Is it possible to use Xamarin Forms Controls in a Uno project?是否可以在 Uno 项目中使用 Xamarin Forms 控件?
【发布时间】: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

标签: xamarin.forms webview cross-platform xamarin.mac uno-platform


【解决方案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()); }
            }
    
            
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2019-03-25
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多