Как нарисовать двоичный вид дерева с использованием WPF? - PullRequest
4 голосов
/ 12 декабря 2011

Я хочу нарисовать это так: Изображение:

enter image description here

Я могу нарисовать двоичное дерево на консоли.Я хочу нарисовать его с помощью WPF.Вот мой код, который я пишу для консоли.

class Program
{
    static void Main(string[] args)
    {
        List<BinaryTreeData> myBinaryData = new List<BinaryTreeData>();
        myBinaryData.Add(new BinaryTreeData{ownID=1});
        myBinaryData.Add(new BinaryTreeData { parentID=1, ownID = 2 });
        myBinaryData.Add(new BinaryTreeData {  parentID=1,ownID = 3 });

        foreach (var item in myBinaryData)
        {
            Console.WriteLine("{0}------{1}", item.parentID, item.ownID);   
        }
    }
}

class BinaryTreeData : INotifyPropertyChanged
{
    private int _ownID;
    private int _parentID;

    public int ownID
    {
        get { return this._ownID; }
        set { this._ownID = value; this.onChange("ownID"); }
    }

    public int parentID
    {
        get { return this._parentID; }
        set { this._parentID = value;  this.onChange("parentID"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void onChange(string propertyName)
    {
        if (PropertyChanged!=null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
} 

Я не могу понять, как я могу это сделать.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Каждый из ваших узлов дерева должен иметь коллекцию дочерних элементов. Если вы хотите ограничить его бинарным деревом, вы можете ограничить свою коллекцию детей максимальной емкостью 2 элемента.

Я бы порекомендовал этот учебник, поскольку он также покажет вам, как этого добиться с помощью MVVM.

http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

EDIT:

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

Попробуйте посмотреть на эти решения -

http://www.codeproject.com/KB/WPF/LayeredTreeDraw.aspx

http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx

1 голос
/ 12 декабря 2011

Итак, я реструктурировал ваш код в соответствии с моим комментарием выше.BinaryTreeData теперь имеет список подэлементов.Вам нужно настроить пространство имен в XAML / local: BinaryTreeData, и оно должно работать .. Cheers!

BinaryTreeData:

  public class BinaryTreeData : INotifyPropertyChanged
  {
    private int _ownID;
    private int _parentID;

    public int ownID
    {
      get { return this._ownID; }
      set
      {
        this._ownID = value;
        this.onChange("ownID");
      }
    }

    private List<BinaryTreeData> _subitems = new List<BinaryTreeData>();

    public List<BinaryTreeData> Subitems
    {
      get { return _subitems; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void onChange(string propertyName)
    {
      if (PropertyChanged != null)
      {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
    }
  }

XAML:

<TreeView x:Name="myTreeView">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate DataType="{x:Type local:BinaryTreeData}" ItemsSource="{Binding Subitems}">
      <TextBlock  Text="{Binding Path=ownID}" />
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

CodeBehind:

public MainWindow()
{
  InitializeComponent();

  List<BinaryTreeData> myBinaryData = new List<BinaryTreeData>();

  BinaryTreeData parent1 = new BinaryTreeData() { ownID = 1 };
  parent1.Subitems.Add(new BinaryTreeData { ownID = 2 });
  parent1.Subitems.Add(new BinaryTreeData { ownID = 3 });

  BinaryTreeData parent2 = new BinaryTreeData() { ownID = 4 };
  parent2.Subitems.Add(new BinaryTreeData { ownID = 5 });
  parent2.Subitems.Add(new BinaryTreeData { ownID = 6 });

  myBinaryData.Add(parent1);
  myBinaryData.Add(parent2);

  myTreeView.ItemsSource = myBinaryData;
}
...