【问题标题】:How to override Control.Invalidate() method?如何覆盖 Control.Invalidate() 方法?
【发布时间】:2012-09-17 11:54:48
【问题描述】:

我使用OwnerDrawAll 属性作为我的控件:

this.customTreeView.DrawMode =System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.customTreeView.DrawNode += 
    new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode);

private void customTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e) {
   if(!myComboBoxChanged) {              // Draw the whole control(tree and info)
        drawNode(e);
        drawInfo(e);
   } else {                              // Draw only info
        drawInfo(e);
   }
}

然后我使用文本更改事件:

private void cBox_TextChanged(object sender, EventArgs e)
        {
            text = cBox.Text;                 // I need this in drawInfo()
            myComboBoxChanged = true;
            this.customTreeView.Invalidate();  // It doesn't do what I want
            myComboBoxChanged = false;
    }

这里Invalidate() 方法重绘整个树,我该如何解决这个问题,所以只有drawInfo() 会被调用?

【问题讨论】:

  • 您正在尝试优化一个错误。将窗口拖出屏幕并重新打开,以查看 DrawNode 事件无法正确绘制。
  • @Hans Passant,有什么办法可以正确地做到这一点,我的意思是只绘制我的部分控件?
  • 我不应该使用.Invalidate 方法。我尝试使用.Refresh方法,它重绘了信息部分,但是其他部分(drawNode())变成了白色,这部分的一切都消失了,请帮助我
  • 在您修复有缺陷的 DrawNode 方法之前,这不会变得更好。您将需要删除该代码中的 myComboBoxChanged。
  • @Hans Passant,你能告诉我我需要如何实现那种代码(当我只需要重绘部分控件时)

标签: c# .net winforms drawing controls


【解决方案1】:

更好的方法是创建自己的 TreeView 类并封装所有方法和属性:

public class MyTreeView : TreeView
{
    public bool TextBoxChanged { get; set; }
    public MyTreeView()
    {
        DrawMode = TreeViewDrawMode.OwnerDrawAll;
        DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode);


    }
    protected override void OnInvalidated(InvalidateEventArgs e)
    {
        //comment  the below line to create your own Invalidate
        //base.OnInvalidated(e);
    }

    private void customTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (!TextBoxChanged)
        {              // Draw the whole control(tree and info)
            drawNode(e);
            drawInfo(e);
        }
        else
        {                              // Draw only info
            drawInfo(e);
        }
    }


    private void drawNode(DrawTreeNodeEventArgs e)
    {
        //...........
    }

    private void drawInfo(DrawTreeNodeEventArgs e)
    {
        //...........
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多