TL; DR:需要暂时禁用TreeView
中的滚动而不会出现任何闪烁。
编写C#插件。我有一个TreeView
控件,显示在编辑器应用程序中打开的文件列表。
TreeView是应用程序加载的UserControl
的一部分,它处理应用程序调用的事件,例如文件更改,上传到服务器等。
我处理了MouseEnter
和MouseLeave
个事件。
MouseEnter
将焦点设置为TreeView,这是必需的,以便双击节点正常工作(即应用程序仅在鼠标单击后才提供输入,这意味着双击变为单击;另外如果移动鼠标右键单击有时返回错误的节点)。鼠标输入的焦点设置都按预期工作。
MouseLeave
会隐藏显示的所有自定义工具提示。
然而,我无法解决的问题是滚动问题。如果TreeView中的节点数太多,则需要滚动TreeView。我正在使用EnsureVisible()
方法来实现编辑器应用程序中当前活动文件的必要滚动。这部分很完美。
当用户使用鼠标滚轮滚动而鼠标不在TreeView区域时,会出现问题。这是一个问题,因为MouseEnter将焦点设置为TreeView,这样即使在鼠标指针位于活动文档中时完成滚动,TreeView中的焦点也会滚动TreeView,这是不需要的。 (当然,滚动条滚动是可以的,因为用户打算滚动TreeView。)
我尝试了更多途径来解决这个问题,但其中没有一个是足够的:
MouseEventArgs
没有Cancel
字段和Delta
字段
是只读的。所以这没有帮助。这是该事件的代码
处理程序:private void treeView1_MouseWheel(object sender, MouseEventArgs e)
{
if (!(this.Width > e.Location.X &&
-1 < e.Location.X &&
this.Height > e.Location.Y &&
-1 < e.Location.Y))
{
//this is where the cancel should go;
return;
}
}
Scrollable
属性设置为false
MouseLeave
事件处理程序,我将其设置为true
MouseEnter
。这样就可以了,但它有副作用
更改为Scrollable
属性会自动调用
RecreateHandle()
类的Control
方法和因为节点
崩溃这会导致闪烁。以下是两个事件处理程序的代码:private void treeView1_MouseEnter(object sender, EventArgs e)
{
treeView1.BeginUpdate();
treeView1.Focus();
treeView1.Scrollable = true;
treeView1.ExpandAll();
treeView1.EndUpdate();
}
private void treeView1_MouseLeave(object sender, EventArgs e)
{
//this first part of the code turns of the custom tooltip if certain conditions are true
if ((_mousePosOrig.Y - MousePosition.Y < 0 | MousePosition.Y - _mousePosOrig.Y < 15)
& Math.Abs(MousePosition.X - _mousePosOrig.X) < 30
& Math.Abs(MousePosition.Y - _mousePosOrig.Y) < 25) { }
else
{
toolTip1.RemoveAll();
_IstoolTipOn = false;
}
//here we turn of the scrolling
treeView1.BeginUpdate();
treeView1.Scrollable = false;
treeView1.ExpandAll();
treeView1.EndUpdate();
}
正如您所看到的,我尝试了BeginUpdate()
方法,但它也无法治愈闪烁。
有人可以帮忙解决这个问题吗?要么告诉我如何处理闪烁或如何以其他方式禁用滚动。