我的双显示器系统上的DataGridView遇到了一个非常奇怪的问题.该问题表现为对控件的极快重复(如完全重绘的30秒),但只有在我的某个屏幕上时才会显示.在另一方面,重绘速度很好.
我有一个Nvidia 8800 GT,带有最新的非beta驱动程序(175件).这是驱动程序错误吗?我会把它留在空中,因为我必须忍受这种特殊的配置.(它不会发生在ATI卡上,但......)
绘画速度与单元格内容无关,自定义绘图根本不会改善性能 - 即使只绘制实心矩形也是如此.
我后来发现在表单上放置一个ElementHost(来自System.Windows.Forms.Integration命名空间)可以解决问题.它不必被搞砸; 它只需要是DataGridView所在的表单的子级.只要Visible属性为true ,就可以将其大小调整为(0,0).
我不想明确地将.NET 3/3.5依赖项添加到我的应用程序中; 我创建了一个方法来在运行时创建此控件(如果可以)使用反射.它工作正常,至少它在没有所需库的机器上优雅地失败 - 它只是变得缓慢.
这个方法还允许我在应用程序运行时应用修复,这样可以更容易地看到WPF库在我的表单上发生了什么变化(使用Spy ++).
经过大量的试验和错误,我注意到在控件本身上启用双缓冲(而不仅仅是表单)可以解决问题!
因此,您只需要根据DataGridView创建一个自定义类,以便启用其DoubleBuffering.而已!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Run Code Online (Sandbox Code Playgroud)
只要我的所有网格实例都使用这个自定义版本,一切都很好.如果我遇到由此引起的情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表单:)(虽然我'将更有可能尝试使用反射来强制从外部启用DoubleBuffered属性再次避免依赖).
令人遗憾的是,这么简单的事情花了我很多时间......
我必须将TextBox中的文本呈现为WriteableBitmap.此代码运行良好,但其中的文本模糊或消除锯齿.关于如何保持别名和清晰的任何想法?
text = new FormattedText(tb.Text,
new CultureInfo("de-de"),
FlowDirection.LeftToRight,
new Typeface(tb.FontFamily, FontStyles.Normal, tb.FontWeight, new FontStretch()),
tb.FontSize,
tb.Foreground);
drawingContext = dv.RenderOpen();
drawingContext.DrawText(text, Pos);
drawingContext.Close();
rtb.Render(dv);
rtb.CopyPixels(new Int32Rect(0, 0, rtb.PixelWidth, rtb.PixelHeight), wb.BackBuffer, wb.BackBufferStride * wb.PixelHeight, wb.BackBufferStride);
Run Code Online (Sandbox Code Playgroud)
我发现的不起作用:
TextOptions.SetTextFormattingMode(dv, TextFormattingMode.Display);
TextOptions.SetTextRenderingMode(dv, TextRenderingMode.Aliased);
Run Code Online (Sandbox Code Playgroud)
要么
RenderOptions.SetBitmapScalingMode(dv, BitmapScalingMode.NearestNeighbor);
RenderOptions.SetEdgeMode(dv, EdgeMode.Aliased);
Run Code Online (Sandbox Code Playgroud) writeablebitmap formatted-text rendertargetbitmap drawingvisual