Xamarin.forms Xamarin表单到Xamarin.Android

Xamarin.forms Xamarin表单到Xamarin.Android,xamarin.forms,xamarin.android,Xamarin.forms,Xamarin.android,我在Xamarin.Forms中有一些页面,因为我需要构建一个自定义相机,所以我使用了Xamarin.Android。 现在我需要从Xamarin.Forms页面转到Xamarin.Android/iOS,然后再次返回到Xamarin.Forms。我怎么做? 请帮助您不一定需要手动在Xamarin.Forms视图/页面和项目特定(iOS/Android)视图之间切换。您可以使用Xamarin.Forms中的CustomRenders来完成此操作 基本上,您将在Xamarin.Forms上创建一个

我在Xamarin.Forms中有一些页面,因为我需要构建一个自定义相机,所以我使用了Xamarin.Android。 现在我需要从Xamarin.Forms页面转到Xamarin.Android/iOS,然后再次返回到Xamarin.Forms。我怎么做?
请帮助

您不一定需要手动在Xamarin.Forms视图/页面和项目特定(iOS/Android)视图之间切换。您可以使用Xamarin.Forms中的CustomRenders来完成此操作

基本上,您将在Xamarin.Forms上创建一个自定义页面,然后在每个平台项目中指定您希望该页面的外观。您可以将这个CustomRender附加到您的自定义页面(您在Xamarin.Forms中创建的页面),框架将为您完成其余的工作

您可以阅读有关自定义渲染器的信息。您可以在Xamarin文档中看到一个非常类似的示例

希望这有帮助。-

欢迎使用SO

在Xamarin表单项目上,您可以使用来实现这一点

例如,创建自定义控件:

public class CameraPreview : View
{
  public static readonly BindableProperty CameraProperty = BindableProperty.Create (
    propertyName: "Camera",
    returnType: typeof(CameraOptions),
    declaringType: typeof(CameraPreview),
    defaultValue: CameraOptions.Rear);

  public CameraOptions Camera {
    get { return (CameraOptions)GetValue (CameraProperty); }
    set { SetValue (CameraProperty, value); }
  }
}
在Xaml中:

<ContentPage ...
             xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
             ...>
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Camera Preview:" />
            <local:CameraPreview Camera="Rear"
              HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

现在,您可以在每个平台上创建自定义渲染器

安卓系统

[assembly: ExportRenderer(typeof(CustomRenderer.CameraPreview), typeof(CameraPreviewRenderer))]
namespace CustomRenderer.Droid
{
    public class CameraPreviewRenderer : ViewRenderer<CustomRenderer.CameraPreview, CustomRenderer.Droid.CameraPreview>
    {
        CameraPreview cameraPreview;

        public CameraPreviewRenderer(Context context) : base(context)
        {
        }

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

            if (e.OldElement != null)
            {
                // Unsubscribe
                cameraPreview.Click -= OnCameraPreviewClicked;
            }
            if (e.NewElement != null)
            {
                if (Control == null)
                {
                  cameraPreview = new CameraPreview(Context);
                  SetNativeControl(cameraPreview);
                }
                Control.Preview = Camera.Open((int)e.NewElement.Camera);

                // Subscribe
                cameraPreview.Click += OnCameraPreviewClicked;
            }
        }

        void OnCameraPreviewClicked(object sender, EventArgs e)
        {
            if (cameraPreview.IsPreviewing)
            {
                cameraPreview.Preview.StopPreview();
                cameraPreview.IsPreviewing = false;
            }
            else
            {
                cameraPreview.Preview.StartPreview();
                cameraPreview.IsPreviewing = true;
            }
        }
        ...
    }
}
[assembly: ExportRenderer (typeof(CameraPreview), typeof(CameraPreviewRenderer))]
namespace CustomRenderer.iOS
{
    public class CameraPreviewRenderer : ViewRenderer<CameraPreview, UICameraPreview>
    {
        UICameraPreview uiCameraPreview;

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

            if (e.OldElement != null) {
                // Unsubscribe
                uiCameraPreview.Tapped -= OnCameraPreviewTapped;
            }
            if (e.NewElement != null) {
                if (Control == null) {
                  uiCameraPreview = new UICameraPreview (e.NewElement.Camera);
                  SetNativeControl (uiCameraPreview);
                }
                // Subscribe
                uiCameraPreview.Tapped += OnCameraPreviewTapped;
            }
        }

        void OnCameraPreviewTapped (object sender, EventArgs e)
        {
            if (uiCameraPreview.IsPreviewing) {
                uiCameraPreview.CaptureSession.StopRunning ();
                uiCameraPreview.IsPreviewing = false;
            } else {
                uiCameraPreview.CaptureSession.StartRunning ();
                uiCameraPreview.IsPreviewing = true;
            }
        }
        ...
    }
}
[程序集:导出渲染器(typeof(CustomRenderer.CameraPreview)、typeof(CameraPreviewRenderer))]
命名空间CustomRenderer.Droid
{
公共类CameraPreviewRenderer:ViewRenderer
{
CameraPreview CameraPreview;
公共CameraPreviewRenderer(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null)
{
//退订
cameraPreview.Click-=单击一次cameraPreview;
}
if(例如NewElement!=null)
{
if(Control==null)
{
cameraPreview=新cameraPreview(上下文);
SetNativeControl(cameraPreview);
}
Control.Preview=Camera.Open((int)e.NewElement.Camera);
//订阅
cameraPreview.Click+=onCamerapReview单击;
}
}
单击CamerapReviewClick时无效(对象发送方,事件参数e)
{
如果(cameraPreview.ispReview)
{
cameraPreview.Preview.StopPreview();
cameraPreview.IsPreviewing=false;
}
其他的
{
cameraPreview.Preview.StartPreview();
cameraPreview.IsPreviewing=true;
}
}
...
}
}
iOS

[assembly: ExportRenderer(typeof(CustomRenderer.CameraPreview), typeof(CameraPreviewRenderer))]
namespace CustomRenderer.Droid
{
    public class CameraPreviewRenderer : ViewRenderer<CustomRenderer.CameraPreview, CustomRenderer.Droid.CameraPreview>
    {
        CameraPreview cameraPreview;

        public CameraPreviewRenderer(Context context) : base(context)
        {
        }

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

            if (e.OldElement != null)
            {
                // Unsubscribe
                cameraPreview.Click -= OnCameraPreviewClicked;
            }
            if (e.NewElement != null)
            {
                if (Control == null)
                {
                  cameraPreview = new CameraPreview(Context);
                  SetNativeControl(cameraPreview);
                }
                Control.Preview = Camera.Open((int)e.NewElement.Camera);

                // Subscribe
                cameraPreview.Click += OnCameraPreviewClicked;
            }
        }

        void OnCameraPreviewClicked(object sender, EventArgs e)
        {
            if (cameraPreview.IsPreviewing)
            {
                cameraPreview.Preview.StopPreview();
                cameraPreview.IsPreviewing = false;
            }
            else
            {
                cameraPreview.Preview.StartPreview();
                cameraPreview.IsPreviewing = true;
            }
        }
        ...
    }
}
[assembly: ExportRenderer (typeof(CameraPreview), typeof(CameraPreviewRenderer))]
namespace CustomRenderer.iOS
{
    public class CameraPreviewRenderer : ViewRenderer<CameraPreview, UICameraPreview>
    {
        UICameraPreview uiCameraPreview;

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

            if (e.OldElement != null) {
                // Unsubscribe
                uiCameraPreview.Tapped -= OnCameraPreviewTapped;
            }
            if (e.NewElement != null) {
                if (Control == null) {
                  uiCameraPreview = new UICameraPreview (e.NewElement.Camera);
                  SetNativeControl (uiCameraPreview);
                }
                // Subscribe
                uiCameraPreview.Tapped += OnCameraPreviewTapped;
            }
        }

        void OnCameraPreviewTapped (object sender, EventArgs e)
        {
            if (uiCameraPreview.IsPreviewing) {
                uiCameraPreview.CaptureSession.StopRunning ();
                uiCameraPreview.IsPreviewing = false;
            } else {
                uiCameraPreview.CaptureSession.StartRunning ();
                uiCameraPreview.IsPreviewing = true;
            }
        }
        ...
    }
}
[程序集:导出渲染器(typeof(CameraPreview)、typeof(CameraPreviewRenderer))]
命名空间CustomRenderer.iOS
{
公共类CameraPreviewRenderer:ViewRenderer
{
UICameraPreview UICameraPreview;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
碱基。一个元素改变(e);
if(e.OldElement!=null){
//退订
uiCameraPreview.Tapped-=onCamerapReview-Tapped;
}
if(例如NewElement!=null){
if(Control==null){
uiCameraPreview=新的uiCameraPreview(e.NewElement.Camera);
SetNativeControl(uiCameraPreview);
}
//订阅
uiCameraPreview.Tapped+=OnCameraPreviewTapped;
}
}
void OnCameraPreviewTapped(对象发送方,事件参数e)
{
if(uiCameraPreview.IsPreviewing){
uiCameraPreview.CaptureSession.StopRunning();
uiCameraPreview.IsPreviewing=false;
}否则{
uiCameraPreview.CaptureSession.StartRunning();
uiCameraPreview.IsPreviewing=true;
}
}
...
}
}
更多信息可参考