Xamarin.forms Xamarin表单到Xamarin.Android
我在Xamarin.Forms中有一些页面,因为我需要构建一个自定义相机,所以我使用了Xamarin.Android。 现在我需要从Xamarin.Forms页面转到Xamarin.Android/iOS,然后再次返回到Xamarin.Forms。我怎么做?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视图/页面和项目特定(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;
}
}
...
}
}
更多信息可参考