【问题标题】:GDI calls do not work in WPF application when called the 1st time第一次调用 GDI 调用在 WPF 应用程序中不起作用
【发布时间】:2019-08-29 09:33:34
【问题描述】:

如下测试函数

  1. 从控制台应用程序调用时工作
  2. 在 WPF 应用程序中第一次调用时工作。 使用“空”像素 (ARGB=0x00000000) 创建大小为 200 x 200 的 .png 文件。
  3. 在 WPF 应用程序中第二次调用(仅在下一行)时工作
  4. 从不同线程调用时有效

(请不要在这里讨论为什么使用 GDI。)

using System.Drawing;
...
class SomeClass
{
    ...
    public void Test(string name)
    {
        using (var bmp = new Bitmap(200, 200))
        {
            using (var gr = Graphics.FromImage(bmp))
            {
                gr.FillRectangle(Brushes.Green, 0, 0, bmp.Width, bmp.Height);
                bmp.Save(Path.Combine(@"C:\Temp\" + name + ".png"));
            }
        }
    }
}

案例 2. 和 3. 从正在执行的 (WPF) MenuItem.Command 中调用。 在执行 MenuItem.Command 期间也会调用案例 4,但会委托给线程池 (ThreadPool.QueueUserWorkItem(...)) 进行测试。

问题似乎不在于 Save(..) 方法。看起来图形的绘制方法(例如 FillRectangle)没有按预期工作(画笔看起来很好)。

【问题讨论】:

  • 调试器在说什么?
  • @sLw “调试器在说什么”到底是什么意思?我用调试器检查了 Brushes .Green,它看起来没问题。也没有例外。当我添加代码来分析位图位时,它们为零。
  • 无法复制。在 App 构造函数中调用一次时工作正常。很难想象为什么它不应该工作。
  • @Clemens "... 案例 2. 和 3. 从正在执行的 (WPF) MenuItem.Command 中调用..."。
  • 也许吧,但这不重要。它适用于我的第一个电话。如果您认为 MenuItem 命令有特定内容,请发布足够的详细信息以使您的问题可重现。

标签: c# wpf gdi+


【解决方案1】:

好吧,我无法回答我的问题,但我可以描述一下我的解决方法: 与其直接调用 Test(...) ,不如将其委托给调度程序似乎有所帮助。

Dispatcher.CurrentDispatcher.Invoke(() => { Test("SomeName"); });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2021-04-03
    • 2011-06-01
    • 1970-01-01
    • 2020-12-15
    • 2019-03-19
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多