VisualTreeView.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright (c) The Perspex Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Reactive.Linq;
  5. using Perspex.Controls;
  6. using Perspex.Controls.Templates;
  7. using Perspex.Diagnostics.ViewModels;
  8. using Perspex.Media;
  9. using ReactiveUI;
  10. namespace Perspex.Diagnostics.Views
  11. {
  12. using Controls = Controls.Controls;
  13. internal class VisualTreeView : TreePage
  14. {
  15. private static readonly PerspexProperty<VisualTreeViewModel> ViewModelProperty =
  16. PerspexProperty.Register<VisualTreeView, VisualTreeViewModel>("ViewModel");
  17. public VisualTreeView()
  18. {
  19. InitializeComponent();
  20. this.GetObservable(DataContextProperty)
  21. .Subscribe(x => ViewModel = (VisualTreeViewModel)x);
  22. }
  23. public VisualTreeViewModel ViewModel
  24. {
  25. get { return GetValue(ViewModelProperty); }
  26. private set { SetValue(ViewModelProperty, value); }
  27. }
  28. private void InitializeComponent()
  29. {
  30. TreeView tree;
  31. Content = new Grid
  32. {
  33. ColumnDefinitions = new ColumnDefinitions
  34. {
  35. new ColumnDefinition(1, GridUnitType.Star),
  36. new ColumnDefinition(4, GridUnitType.Pixel),
  37. new ColumnDefinition(3, GridUnitType.Star),
  38. },
  39. Children = new Controls
  40. {
  41. (tree = new TreeView
  42. {
  43. DataTemplates = new DataTemplates
  44. {
  45. new FuncTreeDataTemplate<VisualTreeNode>(GetHeader, x => x.Children),
  46. },
  47. [!ItemsControl.ItemsProperty] = this.WhenAnyValue(x => x.ViewModel.Nodes),
  48. }),
  49. new GridSplitter
  50. {
  51. Width = 4,
  52. Orientation = Orientation.Vertical,
  53. [Grid.ColumnProperty] = 1,
  54. },
  55. new ContentControl
  56. {
  57. [!ContentProperty] = this.WhenAnyValue(x => x.ViewModel.Details),
  58. [Grid.ColumnProperty] = 2,
  59. }
  60. }
  61. };
  62. tree.GetObservable(TreeView.SelectedItemProperty)
  63. .OfType<VisualTreeNode>()
  64. .Subscribe(x => ViewModel.SelectedNode = x);
  65. }
  66. private Control GetHeader(VisualTreeNode node)
  67. {
  68. var result = new StackPanel
  69. {
  70. Orientation = Orientation.Horizontal,
  71. Gap = 8,
  72. Children = new Controls
  73. {
  74. new TextBlock
  75. {
  76. FontStyle = node.IsInTemplate ? FontStyle.Italic : FontStyle.Normal,
  77. Text = node.Type,
  78. },
  79. new TextBlock
  80. {
  81. [!TextBlock.TextProperty] = node.WhenAnyValue(x => x.Classes),
  82. }
  83. }
  84. };
  85. result.PointerEnter += AddAdorner;
  86. result.PointerLeave += RemoveAdorner;
  87. return result;
  88. }
  89. }
  90. }