Ошибка TreeView в формах Windows при использовании OwnerDrawAll - PullRequest
2 голосов
/ 22 мая 2009

При нажатии на узел в TeeView с помощью OwnerDrawAll он не выбирается, пока не получит указатель мыши, который отличается от стандартного режима и, очевидно, не корректен. У кого-нибудь есть решение этой проблемы?

Запустите приведенный ниже код, чтобы увидеть это поведение:

public partial class Form1 : Form
{
    private System.Windows.Forms.TreeView treeView1;

    public Form1()
    {
        System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Some Node");
        System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Click Me Please!");
        this.treeView1 = new System.Windows.Forms.TreeView();

        this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
        this.treeView1.FullRowSelect = true;
        this.treeView1.LabelEdit = true;
        treeNode1.Text = "Some Node";
        treeNode2.Text = "Click Me Please!";
        this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {treeNode1, treeNode2});
        this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode);

        Controls.Add(treeView1);
    }

    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        Rectangle nodeRect = e.Bounds;
        Rectangle nodeBounds = e.Node.Bounds;

        if (e.Node.IsSelected) {
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, nodeRect);
        }
        else  {
            e.Graphics.FillRectangle(Brushes.White, nodeRect);
        }
        TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, nodeBounds, System.Drawing.Color.Black, Color.Transparent, TextFormatFlags.VerticalCenter | TextFormatFlags.NoClipping);
    }
}

1 Ответ

0 голосов
/ 22 мая 2009

Взгляните на эту страницу от Microsoft . Я добавил обработчик mousedown и метод NodeBounds в ваш пример, и он, похоже, работал так, как и следовало ожидать. Полагаю, это немного хлопотно, но, похоже, это дало желаемый эффект.


Ну, вы можете попробовать это. Возможно, это лучше:

private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
   TreeNode clickedNode = treeView1.GetNodeAt(e.X, e.Y);
   if (NodeBounds(clickedNode).Contains(e.X, e.Y))
   {
      if (treeView1.SelectedNode != clickedNode)
      {
         treeView1.SelectedNode = clickedNode;
         treeView1.LabelEdit = false;
      }
      else
      {
         treeView1.LabelEdit = true;
      }
   }
}

Я просто установил treeView1.LabelEdit = false изначально. И это, казалось, стало ближе к тому, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...