0

所以我有一个扩展的树视图,以便用户可以选择多个项目,但我遇到了一个小错误,它会随机停止绘画本身。

经过一番挖掘,我实际上发现是我的 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() 的按钮来解决,但显然我不希望这样。

我什至需要这个的原因是我手动管理节点的着色以及所选节点,因此所有正常的选择事件实际上都被取消了。但是如果没有开始和结束更新,我仍然会在选择框到达取消之前闪烁。有了这些,我就不会闪烁,但显然这是有代价的。

这是一个演示该问题的空项目的保管箱链接。 如果您在结束更新时中断,您可以看到它正在被调用,但它似乎并没有改变任何东西。但是,如果您单击调用相同代码的按钮,它会解决它。

谁能解释为什么会这样?我错过了一些非常明显的东西吗?或者这只是一般的坏方法?

问候。

答: 由于没有提交任何答案,这是 Hans Passant 引起我注意的解决方案。不想发布并标记为自己的答案,因为我没有想出这个。将此添加到我的扩展 TreeView 类中,所有问题似乎都已解决。(尽管它可能会做出一些糟糕的决定,但除了浪费之外,它似乎并没有伤害任何东西)。

    protected override void OnMouseCaptureChanged(EventArgs e)
    {
        EndUpdate();
        base.OnMouseCaptureChanged(e);
    }
4

0 回答 0