首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElementHost布局问题

ElementHost布局问题
EN

Stack Overflow用户
提问于 2011-06-28 13:18:21
回答 2查看 4.2K关注 0票数 2

我有一堆ElementHosts要加载到我的表单中。发生这种情况时,元素主体都以黑色背景显示。如果我将另一个控件放在前面,然后关闭另一个控件,ElementHosts将正常重新绘制。在谷歌搜索之后,我发现如果我子类ElementHost并在构造函数中这样做

代码语言:javascript
复制
 using (CreateGraphics()) { }

ElementHosts都是用好的backgrounds....BUT绘制的,它们每个元素宿主大约需要300ms才能出现在form...and上它们出现在sequentially...so上就像是在看表单的布局……当然,我手动调用了SuspendLayout和ResumeLayout,但这不会改变结果。

这仅仅是Windows窗体集成的缺陷吗?或者,我可以为此做些什么,以使控件以合理的速率正确显示?

谢谢。

更新:我可以用非常简单的代码重现这个问题:

代码语言:javascript
复制
    public partial class TestControl2 : UserControl
    {
        public TestControl2()
        {
            InitializeComponent();
        }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // deferring load with the BackgroundWorker seems to be related to the problem here...
        var bw = new BackgroundWorker();
        bw.DoWork += delegate { Thread.Sleep(2000); };
        bw.RunWorkerCompleted += delegate
        {
            int x = 0;
            int y = 0;
            for (int i = 0; i < 20; i++)
            {
                var control = new Panel();
                control.Width = 200;
                control.Height = 80;
                control.Controls.Add(new ElementHost { Child = new System.Windows.Controls.Label { Content = @"Hello" }, Dock = DockStyle.Left, Size = new System.Drawing.Size(75, 23) });
                control.Controls.Add(new ElementHost { Child = new System.Windows.Controls.Button { Content = @"button" }, Dock = DockStyle.Fill });
                var uc2 = new UserControl();
                uc2.Controls.Add(control);
                control.Dock = DockStyle.Fill;
                uc2.Left = x;
                uc2.Top = y;
                x += control.Width + 10;
                // adding using (uc2.CreateGraphics()) {} fixes the problem but slows down the load so it looks like each UserControl is being added one at a time
                panel1.Controls.Add(uc2);
            }
        };

        bw.RunWorkerAsync();
    }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-01 04:17:28

天哪,我终于把它修好了。我尝试了来自Google的代码(有几个来源……How do I suspend painting for a control and its children? ...to name one):

代码语言:javascript
复制
    private const int WM_SETREDRAW = 0x000B;

    public static void Suspend(this Control control)
    {
        Message msgSuspendUpdate = Message.Create(control.Handle, WM_SETREDRAW, IntPtr.Zero,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgSuspendUpdate);
    }

    public static void Resume(this Control control)
    {
        var wparam = new IntPtr(1);
        Message msgResumeUpdate = Message.Create(control.Handle, WM_SETREDRAW, wparam,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgResumeUpdate);

        control.Invalidate();
    }

它没有解决我的问题,只留下了一个黑色的乱七八糟的简历,我想尝试将以下内容添加到backgrounds...BUT方法中:

代码语言:javascript
复制
      public static void Resume(this Control control)
      {
            control.Visible = false;                
            // existing code above....
            control.Visible = true;
      }

然后!它起作用了。

票数 2
EN

Stack Overflow用户

发布于 2011-06-30 23:21:24

尽管不能直接解决您的问题,但您是否尝试过在WindowsForm中只添加一个ElementHost (因此只添加一个WPF UserControl)。

如果您创建一个聚合所有单个WPF UserControl的WPF UserControl,则可以实现这一点。这对你来说是一个可行的解决方案吗?可能会减少,还是必须混合使用windows窗体控件和wpf控件?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6501890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档