问题描述
我正在尝试通过触摸替换ContentView.Content
。
但是,如果我触摸ContentView
,则会遇到一个奇怪的异常,如下所示。
System.NotSupportedException:'无法从本机句柄激活SkiaSharp.Views.Forms.SKCanvasVieWrenderer类型的实例'
复制过程
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 (将#修改为@)