2

我有一个用于 iOS 的自定义编辑器,但对于 UWP,我使用另一个名为SfRichTextEditor.

现在我想知道如何像可共享的类一样创建,因为它们具有相同的可绑定属性而不是做我目前所做的,这是ContentView在它们之上创建一个,这导致:

  1. 出于性能目的不必要的嵌套

  2. 重复代码

  3. 似乎有些绑定有问题(未验证,但有些奇怪)。

    <ContentView>
        <OnPlatform x:TypeArguments="View">
            <OnPlatform.Platforms>
                <On Platform="iOS">
    
                    <controls:CustomIOSEditor/>
                </On>
                <On Platform="UWP">
                    <controls:CustomUWPEditor/>
                </On>
            </OnPlatform.Platforms>
        </OnPlatform>
    </ContentView>
    

因此,如果可能的话,我希望有一个可共享的基类来重用代码,而不是这种方法。

这些是我今天拥有的 x2 控件。

我的 iOS 自定义控件:

public class CustomIOSEditor : Editor // Using regular xamarin editor
{
    public static readonly BindableProperty StringResultCommandProperty =
        BindableProperty.Create(
            nameof(StringResultCommand),
            typeof(ICommand),
            typeof(CustomIOSEditor),
            default(ICommand));

    public object StringResultCommandParameter
    {
        get => GetValue(StringResultCommandParameterProperty);
        set => SetValue(StringResultCommandParameterProperty, value);
    }
}

我的 UWP 自定义控件:

public class CustomUWPEditor : SfRichTextEditor // Using SfRichTextEditor instead here.
{
    public static readonly BindableProperty StringResultCommandProperty =
        BindableProperty.Create(
            nameof(StringResultCommand),
            typeof(ICommand),
            typeof(CustomUWPEditor),
            default(ICommand));

    public object StringResultCommandParameter
    {
        get => GetValue(StringResultCommandParameterProperty);
        set => SetValue(StringResultCommandParameterProperty, value);
    }
}

最新线索** 在此处输入图像描述 更新** 共享 .csproj: 在此处输入图像描述

苹果系统: 在此处输入图像描述

设置: 在此处输入图像描述

错误: 在此处输入图像描述

4

2 回答 2

1

由于除了继承不同之外所有代码都是通用的,因此最好使用编译时检查(在这种情况下不用担心代码混乱)。

Xamarin.Forms 项目不支持多目标框架,相反,它的下一个演变称为 MAUI 将

同时,您可以使用MSBuild SDK Extras SDK 代替默认Microsoft.NET.Sdk的 an(但请记住,它不受官方支持),但最终结果是整洁的(编译时检查)。

  • YourSharedProject.csproj更改<Project Sdk="Microsoft.NET.Sdk"><Project Sdk="MSBuild.Sdk.Extras/2.1.2">.
  • 设置您的项目所针对的平台及其版本:

例如,如果您以 netstandard2.1 和 iOS 10为目标,则从第一个开始更改<TargetFramework>netstandard2.1</TargetFramework>为。<TargetFrameworks>netstandard2.1;iOS10</TargetFrameworks>netstandardxx

  • Taget Uwp:(<TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);uap10.0.17763;netcoreapp3.1;net472</TargetFrameworks>如果您安装了 .net framework 4.7.1 而不是 4.7.2,请替换net472net471(.net.core 和 uwp 版本相同)。

最后,您的 .csproj 文件将如下所示:

<Project Sdk="MSBuild.Sdk.Extras/2.1.2">
    <PropertyGroup>
        <TargetFrameworks>netstandard2.1;iOS10</TargetFrameworks>
        <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">
$(TargetFrameworks);uap10.0.17763;netcoreapp3.1;net472</TargetFrameworks>

所有这些都将使您能够在条件编译时检查中使用符号常量:

public class CustomIOSEditor : 
#if __iOS__
           Editor     //will inherit from this if we are building against iOS
#endif
#if WINDOWS_UWP      //will inherit from this if we are building against uwp
           SfRichTextEditor
#endif
{
    public static readonly BindableProperty StringResultCommandProperty =
        BindableProperty.Create(
            nameof(StringResultCommand),
            typeof(ICommand),
            typeof(CustomIOSEditor),
            default(ICommand));

    public object StringResultCommandParameter
    {
        get => GetValue(StringResultCommandParameterProperty);
        set => SetValue(StringResultCommandParameterProperty, value);
    }
}

针对其他平台版本:

  • Mac 版本 20:Xamarin.Mac20
  • 安卓版本 10.0:MonoAndroid10.0
  • tizen 版本 40:tizen40
于 2021-01-09T17:31:33.887 回答
0

您正在寻找的是SetNativeControl().

例如检查这个例子,

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/view#creating-the-custom-renderer-on-uwp

从上面的链接粘贴相同的样本到这里

注意 -CameraPreview在下面的示例中是 Xamarin.Form 元素并且CaptureElement是 UWP 控件

[assembly: ExportRenderer(typeof(CameraPreview), typeof(CameraPreviewRenderer))]
namespace CustomRenderer.UWP
{
    public class CameraPreviewRenderer : ViewRenderer<CameraPreview, Windows.UI.Xaml.Controls.CaptureElement>
    {
        ...
        CaptureElement _captureElement;
        bool _isPreviewing;

        protected override void OnElementChanged(ElementChangedEventArgs<CameraPreview> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                // Unsubscribe
                Tapped -= OnCameraPreviewTapped;
                ...
            }
            if (e.NewElement != null)
            {
                if (Control == null)
                {
                  ...
                  _captureElement = new CaptureElement();
                  SetupCamera();
                  SetNativeControl(_captureElement);
                }
            }
        }

        ...
    }
}
于 2021-01-09T14:35:10.640 回答