如何在代码中制作与 Avalonia UI 兼容的位图?

Posted

技术标签:

【中文标题】如何在代码中制作与 Avalonia UI 兼容的位图?【英文标题】:How to make an Avalonia UI compatible bitmap in code? 【发布时间】:2020-11-03 16:12:22 【问题描述】:

我希望在我的 Avalonia 应用程序中有一个背景位图。让它显示很容易,但在代码中制作却很难。

为了显示,我的主窗口中有 xaml:

  <Window.Background>
    <ImageBrush Source="Binding BackgroundImage"/>
  </Window.Background>

我可以使用以下方法将位图加载到视图模型中:

  Bitmap loader = new Bitmap( @"C:\image.BMP");
  _backgroundImage = loader;

所以,现在我要做的就是使用代码将文本“A2”(例如)制作成位图。

我做了很多实验和查看样本,我最接近的是:

var brush = new SolidColorBrush(Colors.Blue);
var text = new FormattedText();
text.Text = "A2";
var bitmap = new RenderTargetBitmap(new PixelSize(width, height));
using (IDrawingContextImpl ctx = bitmap.CreateDrawingContext(null))

  ctx.DrawText(brush, new Point(0, 0), text); // last param error

_backgroundImage = bitmap;

除了文本变量“无法从 'Avalonia.Media.FormattedText' 转换为 'Avalonia.Platform.IFormattedTextImpl'”这一事实之外,这很好。我已经围绕它进行了试验,试图找出这与 Avalonia 代码之间的不同之处,但被卡住了。请问我错过了什么? (是的,我还没有完成文本大小的详细信息 - 需要先了解基础知识)。

【问题讨论】:

【参考方案1】:

从 0.9 和 0.10 版本开始,您可以将 IDrawingContextImpl 转换为正确的 DrawingContext,方法是将其传递给构造函数。

API 很可能在 0.11 中更改,因此 RenderTargetBitmap 将仅可用于渲染 控件,而不同的 Bitmap 类可用于即时模式绘图。

【讨论】:

谢谢 - 添加一行以使其编译,但它在 DrawText 中给出错误,即 FormattedText 设置不正确(空值)。我进一步使用了静态位图,但不透明度不能满足我的需要 - 白色区域变暗,黑色区域变黑,我需要相反 - 平铺不起作用,所以我会暂时放弃这个想法,然后在某个时候再试一次。可以说,能够为窗口制作低强度背景会很不错。

以上是关于如何在代码中制作与 Avalonia UI 兼容的位图?的主要内容,如果未能解决你的问题,请参考以下文章

Avalonia - 如何像 OneNote 桌面 UI 一样垂直放置 Tab 控件的选项卡

一起学习Avalonia(二)

Avalonia 通知导致应用程序崩溃

Avalonia 中的 Resource.xaml

如何在 Avalonia 中绑定颜色

Avalonia 中的 GetTemplateChild / TemplatePart?