C#TreeView禁用UserControl

时间:2017-04-22 07:39:30

标签: c# .net winforms user-controls treeview

TL; DR:需要暂时禁用TreeView中的滚动而不会出现任何闪烁。

编写C#插件。我有一个TreeView控件,显示在编辑器应用程序中打开的文件列表。

TreeView是应用程序加载的UserControl的一部分,它处理应用程序调用的事件,例如文件更改,上传到服务器等。

我处理了MouseEnterMouseLeave个事件。

MouseEnter将焦点设置为TreeView,这是必需的,以便双击节点正常工作(即应用程序仅在鼠标单击后才提供输入,这意味着双击变为单击;另外如果移动鼠标右键单击有时返回错误的节点)。鼠标输入的焦点设置都按预期工作。

MouseLeave会隐藏显示的所有自定义工具提示。

然而,我无法解决的问题是滚动问题。如果TreeView中的节点数太多,则需要滚动TreeView。我正在使用EnsureVisible()方法来实现编辑器应用程序中当前活动文件的必要滚动。这部分很完美。

当用户使用鼠标滚轮滚动而鼠标不在TreeView区域时,会出现问题。这是一个问题,因为MouseEnter将焦点设置为TreeView,这样即使在鼠标指针位于活动文档中时完成滚动,TreeView中的焦点也会滚动TreeView,这是不需要的。 (当然,滚动条滚动是可以的,因为用户打算滚动TreeView。)

我尝试了更多途径来解决这个问题,但其中没有一个是足够的:

  1. 第一个是尝试处理MouseWheel事件。但问题 是因为我找不到阻止滚动执行的方法 MouseEventArgs没有Cancel字段和Delta字段 是只读的。所以这没有帮助。这是该事件的代码 处理程序:
  2. 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;
        }
    }
    
    1. 我试过的另一条途径,我有点设法解决这个问题 问题是将Scrollable属性设置为false MouseLeave事件处理程序,我将其设置为true MouseEnter。这样就可以了,但它有副作用 更改为Scrollable属性会自动调用 RecreateHandle()类的Control方法和因为节点 崩溃这会导致闪烁。以下是两个事件处理程序的代码:
    2. 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()方法,但它也无法治愈闪烁。

      有人可以帮忙解决这个问题吗?要么告诉我如何处理闪烁或如何以其他方式禁用滚动。

0 个答案:

没有答案