在 SkiaSharp 中不使用 PaintSurface 事件进行绘图的最有效方法

2024-04-15

这个的延伸question https://forums.xamarin.com/discussion/99300/is-there-a-way-to-access-a-sksurface-outside-of-the-paintsurface-event。我在用着SkiaSharp绘制形状OpenGL。大多数 WPF 代码示例建议使用SKElement控制并获取内部绘图表面的参考PaintSurface事件。我一直需要参考绘图表面,而不仅仅是在这个事件中,所以我正在使用SKBitmap and SKCanvas并将输出发送到ImageWPF 中的控制。

XAML

<Canvas x:Name="ScreenControl" />

CS

var bmp = new SKBitmap((int)ScreenControl.ActualWidth, (int)ScreenControl.ActualHeight);
var canvas = new SKCanvas(bmp);
var image = new Image
{
  Stretch = Stretch.Fill
};

canvas.DrawText("Demo", new SKPoint(20, 20), new SKPaint { TextSize = 20 });

var index = 0;
var clock = new Timer();
var wrt = bmp.ToWriteableBitmap();

image.Source = wrt;

clock.Interval = 100;
clock.Elapsed += (object sender, ElapsedEventArgs e) =>
{
  Application.Current.Dispatcher.BeginInvoke(new Action(() =>
  {
    var wrt = bmp.ToWriteableBitmap(); // Potentially slow line #1

    canvas.Clear();
    canvas.DrawText((index++).ToString(), new SKPoint(20, 20), new SKPaint { TextSize = 20 });
    image.Source = wrt;                // Potentially slow line #2
    image.InvalidateVisual();
  }));
};
clock.Start();

ScreenControl.Children.Clear();
ScreenControl.Children.Add(image);

Project

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SkiaSharp.Views.WPF" Version="2.80.3-preview.18" />
  </ItemGroup>

</Project>

Question

有没有一种方法可以更快地绘制,特别是无需重新创建位图bmp.ToWriteableBitmap()并且无需每次都更改图像源image.Source = wrt?后台缓冲区或相关的东西?


你必须使用 Skia 的 SKElement:

<Grid>
    <skia:SKElement PaintSurface="OnPaintSurface" IgnorePixelScaling="True" />
</Grid>

并在 OnPaintSurface 中绘制:

    private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
    {
        // the the canvas and properties
        var canvas = e.Surface.Canvas;

        // make sure the canvas is blank
        canvas.Clear(SKColors.White);

        // draw some text
        var paint = new SKPaint
        {
            Color = SKColors.Black,
            IsAntialias = true,
            Style = SKPaintStyle.Fill,
            TextAlign = SKTextAlign.Center,
            TextSize = 24
        };
        var coord = new SKPoint(e.Info.Width / 2, (e.Info.Height + paint.TextSize) / 2);
        canvas.DrawText("SkiaSharp", coord, paint);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SkiaSharp 中不使用 PaintSurface 事件进行绘图的最有效方法 的相关文章

  • ItemTemplate 与 ControlTemplate

    我对WPF的学习感到困惑 我看到 ControlTemplate 用于确定列表框中每个项目的外观 这不是 ItemTemplate 在列表框中的用途吗 有什么不同 ControlTemplate 允许您更改现有控件的外观和感觉 例如 使普通
  • 在 WPF 中设置控件内容比将类绑定到选择器控件更好的方法是什么?

    我有一个分为 4 个面板的应用程序 有一个主绘图区域 一个顶部面板 一个左侧菜单面板和一个右侧子菜单面板 如下图所示 子菜单的内容由选择哪个顶部菜单按钮决定 子菜单的内容由选择哪个右侧菜单决定 例如 这是单击 网络设计和测试 扩展器上的第一
  • 在单独的线程上显示 WPF-“NotifyIcon”

    我目前正在开发一个 Office 加载项 我需要显示一个显示进度的通知对话框 我正在使用Philipp Sumi 的 wpf notifyicon http www codeproject com Articles 36468 WPF No
  • 数据绑定的 IntelliSense 不起作用

    经过几个小时尝试调试由错误的属性引起的数据绑定问题Binding扩大 一旦我注意到这个错误 我就会意识到如果 IntelliSense 可用 我可能一开始就不会犯这个错误 作为一个习惯在错误输入名称时出现错误 警告的 Visual Stud
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • 类型“MyApp”已包含“MystatusBar”的定义

    我的应用程序 XAML
  • WPF:什么会导致 ComboBox 无法虚拟化?

    这是我的组合框 它似乎没有虚拟化 但我不明白为什么 您知道有什么会导致这种情况吗
  • Prism自定义确认交互

    我使用 Prism Unity WPF 和 Mvvm 在应用程序中创建了一个自定义确认窗口 我需要有关需要发送回视图模型的通知的帮助 我在详细记录视图中有这个 我们称之为 MyDetailView
  • 在 MVVM 中哪里可以捕获异常?

    我的视图模型类有一个连接到服务的方法 不确定这是否是一个好的实践 或者视图模型是否应该是严格的属性和属性更改机制 当然 我想在连接或断开连接时处理任何可能的 WCF 异常 让我们使用未找到端点作为示例 考虑到这是一个我想引起用户注意的异常
  • 自定义 WPF 工具提示

    我想创建一个 WPF 工具提示 其中包含工具提示标题的标签 然后创建一个包含更详细文本的文本块 我在资源字典中创建了以下样式
  • 禁止/阻止选择 wpf 中禁用的组合框项目

    我正在编写一个应用程序 其中我想禁用其中的一些项目ComboBox并且还想禁止 阻止选择禁用的项目 请注意ComboBox在主窗口中有另一个 ComboBox 作为 ComboBox Item init 在运行时由DataTemplateS
  • 从 WPF 绑定列表框中删除项目

    我有一个带有 ListBox 称为 listMyItems 的 WPF 应用程序 它已成功绑定到我创建的 MyItems 类 我有一个名为 currentMyItems 的 MyItems 列表 然后将其作为 ItemSource 分配给
  • WPF鼠标按下事件没有坐标

    我在控件上使用 WPF 鼠标按下事件 我想获取 X Y 坐标 但出现错误 private void button MouseDown object sender MouseButtonEventArgs e double x e X dou
  • WPF 窗口关闭后不会释放内存

    我创建了一个测试代码 private void Application Startup 1 object sender StartupEventArgs e ShutdownMode System Windows ShutdownMode
  • MVVM 中动态创建 MenuItem-Separator 的 WPF 光学样式

    我有一个MenuItem从动态创建其子菜单项ItemsSource 财产 对于分组 我在菜单中有分隔符 分隔符是由 ItemsSource 集合中的 ControlTemplate 为每个空条目创建的MenuItem ItemContain
  • 如何在鼠标悬停时突出显示 MahApps.Metro 的图块?

    我刚刚发现了一个非常出色的 WPF UI 工具包 MahApps Metro 我创建了一个带有 MahApps Metro Controls Tile 类型的图块的窗口 当鼠标经过时 我无法找到突出显示图块的正确方法 你知道我该怎么做吗 我
  • 需要帮助处理 Application.xaml 文件中的 DataTemplate 事件

    我的应用程序中有一个包含几个按钮的数据模板 我希望这些按钮的偶数处理程序在当前页面 我在许多页面中使用此模板 而不是在 Application xaml vb cs 文件中触发 因为我希望在每个页面上执行不同的操作 我希望我说清楚了 您可以
  • 我可以将一个 WPF 窗口叠加在另一个窗口之上吗?

    我有一个 WPF 窗口 其中包含一个WindowsFormsHost元素 我需要在这个元素之上绘制东西 但是它的本质WindowsFormsHost意味着它始终位于绘图堆的顶部 因为我无法在同一 WPF 窗口中绘制WindowsFormsH
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 如何在 MVVM 中使用应用程序命令

    我想使用 ApplicationCommands Cut 复制 粘贴 保存 它们看起来很有趣 因为命令路由 键绑定以及某些控件使用它们的事实 我了解如何绑定到虚拟机上的中继 委托命令 但我似乎无法理解应用程序命令 我找到了一些旧的答案 但没

随机推荐