PropertyGridTemplateSelector.axaml.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Templates;
  5. using Avalonia.Interactivity;
  6. using Avalonia.Markup.Xaml;
  7. using Avalonia.VisualTree;
  8. using SukiUI.Dialogs;
  9. namespace SukiUI.Controls;
  10. public partial class PropertyGridTemplateSelector : ResourceDictionary, IDataTemplate
  11. {
  12. public SukiDialogHost? SukiDialogHost { get; set; }
  13. public bool UseSukiHost { get; set; } = true;
  14. public PropertyGridTemplateSelector()
  15. {
  16. InitializeComponent();
  17. }
  18. private void InitializeComponent()
  19. {
  20. AvaloniaXamlLoader.Load(this);
  21. }
  22. public Control? Build(object? param)
  23. {
  24. if (param is null)
  25. {
  26. return null;
  27. }
  28. var type = param.GetType();
  29. var key = type.Name;
  30. if (TryGetResource(key, null, out var resource))
  31. {
  32. if (resource is IDataTemplate template)
  33. {
  34. return template.Build(param);
  35. }
  36. }
  37. return null;
  38. }
  39. public bool Match(object? data)
  40. {
  41. if (data is null)
  42. {
  43. return false;
  44. }
  45. var type = data.GetType();
  46. var key = type.Name;
  47. if (string.IsNullOrEmpty(key))
  48. {
  49. return false;
  50. }
  51. return ContainsKey(key) != false;
  52. }
  53. private static void ShowSukiHostDialog(ISukiDialogManager manager, ComplexTypeViewModel viewModel)
  54. {
  55. manager
  56. .CreateDialog()
  57. .WithContent(new PropertyGridDialog()
  58. {
  59. DataContext = viewModel.Value
  60. })
  61. .WithTitle(viewModel.DisplayName)
  62. .Dismiss().ByClickingBackground()
  63. .TryShow();
  64. }
  65. private static async Task ShowWindowDialogAsync(Control control)
  66. {
  67. var root = control.GetVisualRoot();
  68. if (root is not Window parentWindow || control.DataContext is not ComplexTypeViewModel childViewModel || childViewModel.Value is null)
  69. {
  70. return;
  71. }
  72. var window = new PropertyGridWindow()
  73. {
  74. DataContext = childViewModel.Value,
  75. Title = childViewModel.DisplayName,
  76. };
  77. await window.ShowDialog(parentWindow);
  78. }
  79. protected virtual async void OnMoreInfoClick(object sender, RoutedEventArgs e)
  80. {
  81. if (sender is not Control control)
  82. {
  83. return;
  84. }
  85. var sukiDialogHost = SukiDialogHost;
  86. if (UseSukiHost)
  87. {
  88. if (sukiDialogHost is not null)
  89. {
  90. if (control.DataContext is not ComplexTypeViewModel childViewModel || childViewModel.Value is null)
  91. {
  92. return;
  93. }
  94. ShowSukiHostDialog(sukiDialogHost.Manager, childViewModel);
  95. }
  96. else
  97. {
  98. var root = control.GetVisualRoot();
  99. if (root is not SukiWindow parentWindow || control.DataContext is not ComplexTypeViewModel childViewModel || childViewModel.Value is null)
  100. {
  101. return;
  102. }
  103. sukiDialogHost = parentWindow.Hosts.Where(p => p is SukiDialogHost).Cast<SukiDialogHost>().FirstOrDefault();
  104. if (sukiDialogHost is not null)
  105. {
  106. ShowSukiHostDialog(sukiDialogHost.Manager, childViewModel);
  107. }
  108. else
  109. {
  110. await ShowWindowDialogAsync(control);
  111. }
  112. }
  113. }
  114. else
  115. {
  116. await ShowWindowDialogAsync(control);
  117. }
  118. }
  119. }