所以我有一个树形视图,我扩展了所以用户可以选择多个项目,但我遇到了一个小错误,它随机停止绘画本身。
经过一番挖掘后,我发现我的MouseDown和MouseUp事件导致了问题:
protected override void OnMouseDown(MouseEventArgs e)
{
BeginUpdate();
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
EndUpdate();
base.OnMouseUp(e);
}
因此,如果用户单击TreeView,但在其外部发布,则不会调用MouseUp事件,并且更新不会结束。我理解的很多,但奇怪之处在于,即使现在正在调用EndUpdate(),无论他们多少次在框中单击它都不会再次开始绘制。这可以通过在其中添加带有EndUpdate()的按钮来解决,但显然我不希望这样。
我甚至需要这个的原因是我手动管理节点以及所选节点的着色,因此所有正常选择事件实际上都被取消了。但是如果没有开始和结束更新,我仍然会在选择框到达取消之前闪烁。有了这些,我没有得到闪烁,但显然它需要付出代价。
Here's a dropbox link to an empty project that demonstrates the issue. 如果你打破了最终更新,你可以看到它被调用,但它似乎没有改变任何东西。但是,如果单击调用相同代码的按钮,则会解析它。
任何人都可以解释为什么会这样吗?我错过了一些非常明显的东西吗?或者这只是一个不好的方式来解决它?
问候。
答案: 由于没有提交答案,以下是Hans Passant引起我注意的解决方案。我不想发布和标记答案,因为我没有想出这个。 将此添加到我的扩展TreeView类中,所有问题似乎都得到了解决。 (虽然它可能会发出一些不好的电话,但除了浪费之外它似乎不会伤害任何东西)。
protected override void OnMouseCaptureChanged(EventArgs e)
{
EndUpdate();
base.OnMouseCaptureChanged(e);
}