加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

如何修复WPF表单调整大小 – 控制滞后和黑色背景?

发布时间:2020-12-14 21:24:27 所属栏目:资源 来源:网络整理
导读:我有一个非常简单的WPF窗口 – 它唯一的东西是右对齐按钮。当我通过拖动左边界来调整窗口大小时,按钮会跳转 – 很多。自己动手,来回拖动左边界。 此外,在调整大小期间,黑色背景会暂时暴露。 在this问题中,我问了一个关于Windows Forms的类似问题。我得
我有一个非常简单的WPF窗口 – 它唯一的东西是右对齐按钮。当我通过拖动左边界来调整窗口大小时,按钮会跳转 – 很多。自己动手,来回拖动左边界。

此外,在调整大小期间,黑色背景会暂时暴露。

在this问题中,我问了一个关于Windows Forms的类似问题。我得到的唯一答案表明这在WPF中得到了修复,然而,令人惊讶的是,它不仅没有修复,而且WPF还增加了第二个视觉错误 – 临时黑色背景。

这是控制滞后的样子;这种情况发生在我通过顶部边框调整窗口大小时(用相机记录,因为屏幕上限会使一切变慢而不那么明显):

黑色边框的示例:在调整窗口大小时捕获了这个边框;这只是一瞬间,但非常明显:

难道我做错了什么?在调整大小期间,如何让我的控件在一个地方保持可视化?我怎样才能避开黑色边框?

注意:按钮最终会在正确的位置结束 – 它只会在调整大小时短暂跳转。

解决方法

这是基于Wieser Software Ltd的第二个解决方案的完整工作代码。
public partial class MainView : Window
{
    public MainView()
    {
        InitializeComponent();

        //ensure win32 handle is created
        var handle = new WindowInteropHelper(this).EnsureHandle();

        //set window background
        var result = SetClassLong(handle,GCL_HBRBACKGROUND,GetSysColorBrush(COLOR_WINDOW));
    }

    public static IntPtr SetClassLong(IntPtr hWnd,int nIndex,IntPtr dwNewLong)
    {
        //check for x64
        if (IntPtr.Size > 4)
            return SetClassLongPtr64(hWnd,nIndex,dwNewLong);
        else
            return new IntPtr(SetClassLongPtr32(hWnd,unchecked((uint)dwNewLong.ToInt32())));
    }

    private const int GCL_HBRBACKGROUND = -10;
    private const int COLOR_WINDOW = 5;

    [DllImport("user32.dll",EntryPoint = "SetClassLong")]
    public static extern uint SetClassLongPtr32(IntPtr hWnd,uint dwNewLong);

    [DllImport("user32.dll",EntryPoint = "SetClassLongPtr")]
    public static extern IntPtr SetClassLongPtr64(IntPtr hWnd,IntPtr dwNewLong);

    [DllImport("user32.dll")]
    static extern IntPtr GetSysColorBrush(int nIndex);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读