2011-09-14 14 views
1

HotTrackingプロパティを持つ単純なTreeViewがTrueに設定されています。これは、アイテム上にマウスを移動すると機能します。しかし、それは私がドラッグを使用すると動作しません&ドロップとツリービューアイテム上の何かをドラッグします。 DragDropでHotTrackingを使用する方法はありますか?または任意の回避策?TreeViewのHotTrackingがドラッグ&ドロップで動作しない

答えて

1

コントロールは、D + D通知のみを受け取り、マウスメッセージは表示されません。

private void treeView1_DragOver(object sender, DragEventArgs e) { 
     if (e.Data.GetDataPresent("something")) { 
      var pos = treeView1.PointToClient(new Point(e.X, e.Y)); 
      var hit = treeView1.HitTest(pos); 
      if (hit.Location == TreeViewHitTestLocations.Label) { 
       treeView1.SelectedNode = hit.Node; 
       e.Effect = DragDropEffects.Copy; 
      } 
      else e.Effect = DragDropEffects.None; 
     } 
    } 

通常、ユーザーがビューをスクロールしてノードを展開できるようにするには、もっと多くの作業を行う必要があります。

+0

はhotTrackingと同じではありません。ツリーにホットトラッキングされているかのようにノードを描画するように指示する方法はありますか?セルフドローイングの枠線、ident、アイコン、およびテキストなしで優れています。私はTreeView(SetWindowTheme( "explorer")によって拡張された)と同じ問題に直面した。 – DimDim

0

ノードを@Hansとして選択するのは簡単な解決策ですが、ノード選択のイベントがある場合、または選択したノードを保持する必要がある場合は使用できません。 私が見つけた唯一の方法は、VisualStylesRendererを使用してノードを作成することです。

private void plTree_DragOver(object sender, DragEventArgs e) 
    {    
     Point pt = plTree.PointToClient(new Point(e.X, e.Y)); 

     var overNode = plTree.GetNodeAt(pt); 
     bool canMoveTo = overNode != null && 
         TreeNodeIsFolder(overNode) && 
         !IsFirstNodeParentToSecond(GetDraggedNodes(e)[0], overNode);// all dragged nodes are of the same parent 
     e.Effect = canMoveTo ? DragDropEffects.Move : DragDropEffects.None; 

     if (overNode == null) return; 

     if (_lastCustomDrawNode != overNode) 
     { 
      NormalDrawNode(_lastCustomDrawNode); 
      CustomDrawNode(overNode); 
     } 
     _lastCustomDrawNode = overNode; 
    } 

    private void NormalDrawNode(TreeNode aNode) 
    { 
     if (aNode == null) return; 

     if (_normalNodeRenderer == null) 
      _normalNodeRenderer = new VisualStyleRenderer("Explorer::TreeView", 1, 1); 
     Debug.WriteLine("normal render" + DateTime.Now); 
     RenderTreeNode(_normalNodeRenderer, aNode, true); 

     _lastCustomDrawNode = null; 
    } 

    private void CustomDrawNode(TreeNode aNode) 
    { 
     if (_hotNodeRenderer == null) 
      _hotNodeRenderer = new VisualStyleRenderer("Explorer::TreeView", 1, 2); 
     Debug.WriteLine("custom render" + DateTime.Now); 
     RenderTreeNode(_hotNodeRenderer, aNode, false); 
    } 

    private void RenderTreeNode(VisualStyleRenderer renderer, TreeNode aNode, bool drawDefaultBck) 
    { 
     if(_treeGraphics == null) 
      _treeGraphics = plTree.CreateGraphics(); 

     const int iconShift = 21; 
     Rectangle aRec = aNode.Bounds; 

     var bckRec = new Rectangle(aRec.Location.X - iconShift, aRec.Location.Y, aRec.Width + iconShift, aRec.Height); 

     if (!drawDefaultBck) 
      renderer.DrawBackground(_treeGraphics, bckRec); 
     else 
      _treeGraphics.FillRectangle(_treebckgBrush, bckRec); 

     var textRec = new Rectangle(aRec.Location.X + 1, aRec.Location.Y - 1, aRec.Width, aRec.Height); 
     TextRenderer.DrawText(_treeGraphics, aNode.Text, GetTreeNodeFont(aNode), textRec, Color.FromKnownColor(KnownColor.ControlText)); 

     var imgRec = new Rectangle(aRec.Location.X + 2 - iconShift, aRec.Location.Y, 16, 16); 
     renderer.DrawImage(_treeGraphics, imgRec, ImageListTree.Images[aNode.ImageIndex]); 
    } 

この記事は、テーマ図面で多くのことができます:ノードを選択 VisualStyleRenderer and themes (WinForms)

+0

Btw誰かが "IconShift"を動的に取得する方法を教えてもらえますか?ハードコードされていませんか? – DimDim

関連する問題