说明
在使用Wine适配WPF程序时,遇到和许多问题,这里对这些问题做一个记录,方便其它遇到这个问题的人能够很快的解决问题。
一、 内容显示黑屏
问题描述
- 控件显示黑屏
- 部分阴影显示黑屏
- 控件拖动边框黑屏
解决办法
修改窗口或者进程的渲染模式为软件渲染(这里提供设置进程的软件渲染方法):
public App()
{
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
二、透明窗口全屏时,鼠标不穿透
问题描述
我有一个透明窗口,它是一个全屏置顶窗口,窗口里面有一个工具条,可以通过鼠标拖动工具条的位置,程序启动后,在不点击工具条的时候,鼠标是可以穿透的,当点击一次工具条后,在点击其余透明的地方,就不能穿透了
问题原因分析
通过排查,导致这个原因是窗口在初始化的时候设置了ResizeMode=“NoResize”,通过测试,设置为NoResize或者CanMinimize都存在问题
解决办法
办法1
取消窗口的ResizeMode设置或者显示设置为:CanResize或者CanResizeWithGrip
办法1遇到的问题
鼠标穿透已经没有问题了 ,但是在拖动工具条或者鼠标从工具条上经过的时候,控件呈现显示缓慢或者抖动的问题,体验很不好,重新将ResizeMode还原,则没有这个问题
办法2(正确办法)
窗口在初始化的时候,不设置ResizeMode参数,在窗口的Loaded事件里面在设置ResizeMode:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.ResizeMode = ResizeMode.CanResize;
this.Loaded+= OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
this.ResizeMode = ResizeMode.NoResize;
}
}
通过这个方法设置后,既能解决鼠标穿透问题,也没有发现拖动问题。
备注:
WPF程序在其它一些设置也会导致初始化和Loaded事件呈现出的结果不一样,目前我已知的有着2个属性:
- TopMost
- ResizeMode
建议:如果需要调整这些属性,可以在Loaded事件里面再设置他们,这样可以避免一些千奇百怪的问题。
三、使用PdfSharp将图片保存为pdf时报错
问题描述
当使用PdfSharp库将图片保存为pdf时,提示ReadTrueColorMemoryBitmap: unsupported format错误
问题原因分析
通过查看pdfsharp源码发现出错问题有这些:
if (ReadWord(imageBits, 0) != 0x4d42 || // "BM"
ReadDWord(imageBits, 2) != streamLength ||
ReadDWord(imageBits, 14) != 40 || // sizeof BITMAPINFOHEADER
ReadDWord(imageBits, 18) != width ||
ReadDWord(imageBits, 22) != height)
{
throw new NotImplementedException("ReadTrueColorMemoryBitmap: unsupported format");
}
在查看我的软件代码中的处理:
using MemoryStream stream = new MemoryStream();
testimage.Save(stream, ImageFormat.Png);
using XImage img = XImage.FromStream(stream);
doc.Pages[doc.Pages.Count - 1].Width = img.PointWidth;
doc.Pages[doc.Pages.Count - 1].Height = img.PointHeight;
xgr.DrawImage(img, 0, 0);//这句报错
发现代码中,img加载的图片流是png格式的。
解决办法
修改img加载图片流方式为bmp格式:
using MemoryStream stream = new MemoryStream();
//这里调整为bmp是为了适配wine,wine中如果设置为bmp,会提示“ReadTrueColorMemoryBitmap: unsupported format”错误
testimage.Save(stream, ImageFormat.Bmp);
using XImage img = XImage.FromStream(stream);
doc.Pages[doc.Pages.Count - 1].Width = img.PointWidth;
doc.Pages[doc.Pages.Count - 1].Height = img.PointHeight;
xgr.DrawImage(img, 0, 0);