๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
C#

๐Ÿ”€ WPF TreeView ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ๋…ธ๋“œ ์ด๋™ ๊ตฌํ˜„

by samie 2025. 4. 24.
WPF TreeView ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ตฌํ˜„

๐Ÿ”€ WPF TreeView ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ๋…ธ๋“œ ์ด๋™ ๊ตฌํ˜„

์ด๋ฒˆ์—๋Š” TreeView ํ•ญ๋ชฉ์„ ๋งˆ์šฐ์Šค๋กœ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” UI์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ชฉ์ฐจ

  • 1. Drag & Drop ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ
  • 2. ๋…ธ๋“œ ์ด๋™ ์ฒ˜๋ฆฌ
  • 3. ๋™์ผ ๋ถ€๋ชจ ๋‚ด ์ด๋™ vs ๊ณ„์ธต ์ด๋™
  • 4. ํ™•์žฅ ํŒ

1. Drag & Drop ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ

XAML์—์„œ TreeView์™€ TreeViewItem์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<TreeView x:Name="MyTreeView"
          PreviewMouseLeftButtonDown="TreeView_PreviewMouseLeftButtonDown"
          Drop="TreeView_Drop"
          AllowDrop="True">
    ...
</TreeView>

2. Drag ์‹œ์ž‘๊ณผ Drop ์ฒ˜๋ฆฌ

์ฝ”๋“œ ๋น„ํ•˜์ธ๋“œ์—์„œ ๋“œ๋ž˜๊ทธ ์‹œ์ž‘๊ณผ ๋“œ๋กญ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

private Category? _draggedItem;

private void TreeView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem item = ItemsControl.ContainerFromElement(MyTreeView, e.OriginalSource as DependencyObject) as TreeViewItem;
    if (item?.DataContext is Category category)
    {
        _draggedItem = category;
        DragDrop.DoDragDrop(item, category, DragDropEffects.Move);
    }
}

private void TreeView_Drop(object sender, DragEventArgs e)
{
    if (_draggedItem == null) return;

    Category? target = (e.OriginalSource as FrameworkElement)?.DataContext as Category;
    if (target != null && target != _draggedItem && !IsChild(_draggedItem, target))
    {
        _draggedItem.Parent?.Children.Remove(_draggedItem);
        _draggedItem.Parent = target;
        target.Children.Add(_draggedItem);
    }
}

private bool IsChild(Category parent, Category child)
{
    if (parent.Children.Contains(child)) return true;
    return parent.Children.Any(c => IsChild(c, child));
}

3. ๋…ธ๋“œ ๊ตฌ์กฐ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ณ„์ธต ์ด๋™

๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ž์‹ ์˜ ํ•˜์œ„๋กœ ๋“œ๋ž˜๊ทธํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋™์ผํ•œ ๋ถ€๋ชจ ๋‚ด์—์„œ์˜ ์œ„์น˜ ๋ณ€๊ฒฝ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ํ™•์žฅ ํŒ

  • Drop ์‹œ ์•„์ด์ฝ˜ ํšจ๊ณผ ๋˜๋Š” ํ•˜์ด๋ผ์ดํŒ… ์ถ”๊ฐ€
  • ๋…ธ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ (Drag ์œ„์น˜์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ)
  • Undo/Redo ๊ธฐ๋Šฅ ์—ฐ๋™

โœ… ๋งˆ๋ฌด๋ฆฌ

TreeView์— ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณต์žกํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ํŽธ์—์„œ๋Š” TreeView ํ•ญ๋ชฉ์„ ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ์ฒ˜๋Ÿผ ์‹ค์ œ ํŒŒ์ผ๊ณผ ์—ฐ๋™ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!