Browse Source

show adorner while hovering any part of the control's TreeViewItem in DevTools (#14231)

pull/14243/head
AtomCrafty 2 years ago
committed by GitHub
parent
commit
1c792b294f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml
  2. 41
      src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs

7
src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml

@ -7,13 +7,12 @@
<TreeView Name="tree"
BorderThickness="0"
ItemsSource="{Binding Nodes}"
SelectedItem="{Binding SelectedNode, Mode=TwoWay}">
SelectedItem="{Binding SelectedNode, Mode=TwoWay}"
PointerMoved="UpdateAdorner">
<TreeView.DataTemplates>
<TreeDataTemplate DataType="vm:TreeNode"
ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" Spacing="8"
PointerEntered="AddAdorner"
PointerExited="RemoveAdorner">
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="{Binding Type}" FontWeight="{Binding FontWeight}"/>
<TextBlock Text="{Binding Classes}"/>
<TextBlock Foreground="Gray" Text="{Binding ElementName}"/>

41
src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs

@ -1,14 +1,11 @@
using System;
using System.Diagnostics;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Primitives;
using Avalonia.Diagnostics.ViewModels;
using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.VisualTree;
namespace Avalonia.Diagnostics.Views
{
@ -16,6 +13,7 @@ namespace Avalonia.Diagnostics.Views
{
private readonly Panel _adorner;
private AdornerLayer? _currentLayer;
private TreeViewItem? _hovered;
private TreeView _tree;
public TreePageView()
@ -39,6 +37,11 @@ namespace Avalonia.Diagnostics.Views
AdornerLayer.SetIsClipEnabled(_adorner, false);
}
private static Thickness InvertThickness(Thickness input)
{
return new Thickness(-input.Left, -input.Top, -input.Right, -input.Bottom);
}
protected void AddAdorner(object? sender, PointerEventArgs e)
{
var node = (TreeNode?)((Control)sender!).DataContext;
@ -80,11 +83,6 @@ namespace Avalonia.Diagnostics.Views
}
}
private static Thickness InvertThickness(Thickness input)
{
return new Thickness(-input.Left, -input.Top, -input.Right, -input.Bottom);
}
protected void RemoveAdorner(object? sender, PointerEventArgs e)
{
foreach (var border in _adorner.Children.OfType<Border>())
@ -98,6 +96,31 @@ namespace Avalonia.Diagnostics.Views
_currentLayer = null;
}
protected void UpdateAdorner(object? sender, PointerEventArgs e)
{
if (e.Source is not StyledElement source)
{
return;
}
var item = source.FindLogicalAncestorOfType<TreeViewItem>();
if (item == _hovered)
{
return;
}
RemoveAdorner(sender, e);
if (item is null || item.TreeViewOwner != _tree)
{
_hovered = null;
return;
}
_hovered = item;
AddAdorner(item, e);
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);

Loading…
Cancel
Save