0

В принципе, я хочу отобразить двоичное дерево в WinRT. У меня есть ObservableCollection, который содержит значения узлов.Рисование двоичного дерева в WinRT

Как вы считаете, что лучше всего попробовать?

+0

Вы должны быть в состоянии повторно использовать большую часть [этого] (http://stackoverflow.com/questions/15579069/graph-nodes-coordinates-evaluation/15580293#15580293) в WinRT, хотя вам, вероятно, придется изменить какой-то XAML, потому что есть несколько возможностей XAML которые отсутствуют в WinRT. –

ответ

2

Если «стандарт» TreeView управления не удовлетворяет эстетические потребности - вы можете либо попытаться построить дерево из некоторых Shape элементов, возможно, связанных и, скорее всего, выложенных на Canvas или в качестве альтернативы, чтобы поддержать огромные деревья - используйте DirectX - либо с родным компонентом WinRT, либо с помощью SharpDX.

0

Управление с помощью инструмента WinRT Xaml Toolkit можно использовать с помощью управления TreeView.

Вот пример использования: https://winrtxamltoolkit.codeplex.com/SourceControl/latest#WinRTXamlToolkit.Sample/Views/Controls/TreeViewTestPage.xaml

управления портирован из Silverlight Toolkit с оригиналом, а также налетом дружелюбнее шаблон доступен. Вы можете найти WinRTXamlToolkit on NuGet.

1

Вы можете использовать свою собственную панель (пользовательский), чтобы достигнуть ваше требование,

public class MyBinaryTreePanel : Panel 
    { 
     public double MaxRowHeight { get; set; } 
     public MyBinaryTreePanel() 
     { 
      MaxRowHeight = 0.0; 
     } 
     protected override Size ArrangeOverride(Size finalSize) 
     {    
      double rowHeight=0; 
      double columnWidth = finalSize.Width; 
      int total = Children.Count; 
      int temp = total; 

      int count = 0; 
      do 
      { 
       temp /= 2; 
       count++; 
      } while (temp != 1); 
      count++;   
      int Row = count; 
      MaxRowHeight = finalSize.Height/total; 

      double temrow = 0; 
      int i = 0; 
      for (int a = 0; a < Row; a++) 
      { 
       double temp34 = 0; 
       double tempColumn = 0;     

       columnWidth = ((finalSize.Width)/(Math.Pow(2, a))); 
       for (int b = 0; b < (Math.Pow(2, a)); b++) 
       { 
        if (i < total) 
        { 
         rowHeight = Children[i].DesiredSize.Height > MaxRowHeight ? Children[i].DesiredSize.Height : MaxRowHeight; 
         Children[i].Arrange(new Rect(tempColumn, temrow, columnWidth, rowHeight)); 
         i++; 
         if (rowHeight >= temp34) 
         { 
          temp34 = rowHeight; 
         } 
         else 
         { 
          rowHeight = temp34; 
         } 
         tempColumn += columnWidth; 
        } 

       } 
       temrow += temp34; 

      }// 
      return finalSize; 
     } 
     protected override Size MeasureOverride(Size availableSize) 
     { 
      int total = Children.Count; 
      int temp = total; 
      int count = 0; 
      do 
      { 
       temp /= 2; 
       count++; 
      } while (temp != 1); 
      count++; 
      int Row = count; 
      MaxRowHeight = (availableSize.Height)/Row; 
      Size MyDesiredSize = new Size(); 
      int i = 0; 
      for (int a = 0; a < Row; a++) 
      { 
       double value2 = 0.0; 
       for (int b = 0; b < (Math.Pow(2, a)); b++) 
       { 
        if (i < total) 
        { 
         Children[i].Measure(availableSize); 
         double value1 = Children[i].DesiredSize.Height; 

         if (value1 >= value2) 
         { 

          MyDesiredSize.Height = value1; 
          value2 = value1; 
         } 
         else 
         { 
          MyDesiredSize.Height = value2; 

         } 
         i++; 
        } 
       } 
       MyDesiredSize.Height = MyDesiredSize.Height > MaxRowHeight ? MyDesiredSize.Height : MaxRowHeight; 
      } 
          return MyDesiredSize; 
     } 
    } 

Я надеюсь, что это поможет,

С уважением, Joy Rex

Смежные вопросы