C# 如何重写Control.Invalidate()方法?
我为我的控件使用C# 如何重写Control.Invalidate()方法?,c#,.net,winforms,drawing,controls,C#,.net,Winforms,Drawing,Controls,我为我的控件使用OwnerDrawAll属性: this.customTreeView.DrawMode =System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; this.customTreeView.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode); private void customTreeView_Dr
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()
。更好的方法是创建自己的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)
{
//...........
}
}
您正在尝试优化一个bug。将窗口从屏幕上拖下来,然后再拖回去,可以看到DrawNode事件无法正确绘制。@Hans Passant,有没有办法正确绘制,我的意思是只绘制我控件的一部分?我不应该使用
。Invalidate
方法。我尝试使用.Refresh
方法,它重新绘制了信息部分,但其他部分(drawNode()
)变为白色,并且该部分中的所有内容都消失了,请帮助meThis,直到您修复错误的drawNode方法,meThis才会变得更好。您需要去掉代码中的MyComboxChanged。@Hans Passant,您能告诉我如何实现这种代码(当我只需要重新绘制部分控件时)