如何解决System.NotSupportedException:'无法从本机句柄激活SkiaSharp.Views.Forms.SKCanvasViewRenderer类型的实例' 解决方法
我正在尝试通过触摸替换ContentView.Content
。
但是,如果我触摸ContentView
,则会遇到一个奇怪的异常,如下所示。
System.NotSupportedException:'无法从本机句柄激活SkiaSharp.Views.Forms.SKCanvasViewRenderer类型的实例'
复制过程
- 创建空白Xamarin项目。
- 添加“ MyContetView.cs”文件。
- 复制并粘贴源代码
public class MyContentView : ContentView
{
private string _text;
private SKCanvasView _canvasView;
private Editor _editorView;
public MyContentView()
{
_text = "Hello,World!";
_canvasView = new SKCanvasView()
{
WidthRequest = 100,HeightRequest = 100,EnableTouchEvents = true
};
_canvasView.PaintSurface += (sender,e) =>
{
e.Surface.Canvas.Clear();
var rect = new SKRect(0,(float)(Width * Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Density),(float)(Height * Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Density));
var rectPaint = new SKPaint()
{
Color = SKColors.Red,IsStroke = false,StrokeWidth = 1
};
e.Surface.Canvas.DrawRect(rect,rectPaint);
var textPaint = new SKPaint()
{
Color = SKColors.Black,IsAntialias = true,TextSize = 16
};
e.Surface.Canvas.DrawText(_text,textPaint);
};
_canvasView.Touch += (sender,e) =>
{
ToggleContent();
e.Handled = true;
};
_editorView = new Editor()
{
AutoSize = EditorAutoSizeOption.TextChanges
};
_editorView.Completed += (sender,e) =>
{
_text = _editorView.Text;
};
_editorView.Unfocused += (sender,e) =>
{
ToggleContent();
};
_canvasView.InvalidateSurface();
Content = _canvasView;
}
public void ToggleContent()
{
if (Content == _canvasView)
{
Content = _editorView;
}
else
{
_canvasView.InvalidateSurface();
Content = _canvasView;
}
}
}
- 运行
- 触摸
2020.08.13更新
我在 Xamarin.Forms 上创建了一个issue,因为替换ContentView.Content
应该有效,因为SKCanvasView
像其他 Xamarin一样继承了View
.Froms 。
解决方法
代替替换ContentView.Content
,在VisualElement.IsVisible
和SKCanvasView
之间切换Editor
。
<ContentView.Content>
<AbsoluteLayout>
<skia:SKCanvasView x:Name="CanvasView"
AbsoluteLayout.LayoutFlags="All"
AbsoluteLayout.LayoutBounds="0,1,1"
IsVisible="True"
EnableTouchEvents="True"/>
<Editor x:Name="EditorView"
AbsoluteLayout.LayoutFlags="All"
AbsoluteLayout.LayoutBounds="0,1"
IsVisible="False"
AutoSize="TextChanges" />
</AbsoluteLayout>
</ContentView.Content>
public void ToggleState()
{
if (isCanvasView)
{
CanvasView.IsVisible = true;
CanvasView.Focus();
EditorView.IsVisible = false;
EditorView.Unfocus();
}
else
{
CanvasView.IsVisible = false;
CanvasView.Unfocus();
EditorView.IsVisible = true;
EditorView.Focus();
}
}
对于更简洁的代码,与if
相比,状态模式可能是一个很好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。