Browse Source

TreeViewItem updates.

pull/1831/head
William David Cossey 8 years ago
parent
commit
f6dfd1688e
  1. 29
      src/Avalonia.Controls/TreeViewItem.cs
  2. 15
      src/Avalonia.Styling/LogicalTree/LogicalExtensions.cs
  3. 163
      src/Avalonia.Themes.Default/TreeViewItem.xaml

29
src/Avalonia.Controls/TreeViewItem.cs

@ -6,7 +6,6 @@ using Avalonia.Controls.Generators;
using Avalonia.Controls.Mixins; using Avalonia.Controls.Mixins;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.LogicalTree; using Avalonia.LogicalTree;
@ -37,8 +36,7 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
public static readonly DirectProperty<TreeViewItem, int> DepthProperty = public static readonly DirectProperty<TreeViewItem, int> DepthProperty =
AvaloniaProperty.RegisterDirect<TreeViewItem, int>( AvaloniaProperty.RegisterDirect<TreeViewItem, int>(
nameof(Depth), nameof(Depth), o => o.Depth);
o => o.Depth);
private static readonly ITemplate<IPanel> DefaultPanel = private static readonly ITemplate<IPanel> DefaultPanel =
new FuncTemplate<IPanel>(() => new StackPanel()); new FuncTemplate<IPanel>(() => new StackPanel());
@ -80,27 +78,8 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
public int Depth public int Depth
{ {
get { return this.GetDepth(this); } get { return _depth; }
} private set { SetAndRaise(DepthProperty, ref _depth, value); }
private int GetDepth(TreeViewItem item)
{
TreeViewItem parent;
while ((parent = GetParent(item)) != null)
{
return GetDepth(parent) + 1;
}
return 0;
}
private static TreeViewItem GetParent(TreeViewItem item)
{
var parent = item.InheritanceParent;
while (!(parent == null || parent is TreeViewItem || parent is TreeView))
{
parent = item.Parent;
}
return parent as TreeViewItem;
} }
/// <summary> /// <summary>
@ -127,6 +106,8 @@ namespace Avalonia.Controls
base.OnAttachedToLogicalTree(e); base.OnAttachedToLogicalTree(e);
_treeView = this.GetLogicalAncestors().OfType<TreeView>().FirstOrDefault(); _treeView = this.GetLogicalAncestors().OfType<TreeView>().FirstOrDefault();
Depth = this.CalculateDistanceFromLogicalParent<TreeView>() - 1;
if (ItemTemplate == null && _treeView?.ItemTemplate != null) if (ItemTemplate == null && _treeView?.ItemTemplate != null)
{ {
ItemTemplate = _treeView.ItemTemplate; ItemTemplate = _treeView.ItemTemplate;

15
src/Avalonia.Styling/LogicalTree/LogicalExtensions.cs

@ -87,5 +87,20 @@ namespace Avalonia.LogicalTree
{ {
return target.GetLogicalAncestors().Any(x => x == logical); return target.GetLogicalAncestors().Any(x => x == logical);
} }
public static int CalculateDistanceFromLogicalParent<T>(this ILogical logical, int @default = -1) where T : class
{
Contract.Requires<ArgumentNullException>(logical != null);
var result = 0;
while (logical != null && logical.GetType() != typeof(T))
{
++result;
logical = logical.LogicalParent;
}
return logical != null ? result : @default;
}
} }
} }

163
src/Avalonia.Themes.Default/TreeViewItem.xaml

@ -1,91 +1,92 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"> xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls">
<Style Selector="TreeViewItem"> <Style Selector="TreeViewItem">
<Style.Resources> <Style.Resources>
<local:MarginMultiplierConverter Indent="16" Left="True" x:Key="leftMarginConverter" /> <converters:MarginMultiplierConverter Indent="16" Left="True" x:Key="LeftMarginConverter" />
</Style.Resources> </Style.Resources>
<Setter Property="Padding" Value="2"/> <Setter Property="Padding" Value="2"/>
<Setter Property="Background" Value="{DynamicResource InvisibleSelectionBrush}"/> <Setter Property="Background" Value="{DynamicResource InvisibleSelectionBrush}"/>
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
<StackPanel> <StackPanel>
<Border Name="SelectionBorder" <Border Name="SelectionBorder"
Focusable="True" Focusable="True"
Background="{TemplateBinding Background}" Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" BorderThickness="{TemplateBinding BorderThickness}"
TemplatedControl.IsTemplateFocusTarget="True"> TemplatedControl.IsTemplateFocusTarget="True">
<Grid ColumnDefinitions="16, *" Margin="{TemplateBinding Depth, Converter={StaticResource leftMarginConverter}}" > <Grid ColumnDefinitions="16, *"
<ToggleButton Name="expander" Margin="{TemplateBinding Depth, Mode=OneWay, Converter={StaticResource LeftMarginConverter}}" >
Focusable="False" <ToggleButton Name="expander"
IsChecked="{TemplateBinding IsExpanded, Mode=TwoWay}"/> Focusable="False"
<ContentPresenter Name="PART_HeaderPresenter" IsChecked="{TemplateBinding IsExpanded, Mode=TwoWay}"/>
Focusable="False" <ContentPresenter Name="PART_HeaderPresenter"
Content="{TemplateBinding Header}" Focusable="False"
HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}" Content="{TemplateBinding Header}"
Padding="{TemplateBinding Padding}" HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}"
Grid.Column="1"/> Padding="{TemplateBinding Padding}"
</Grid> Grid.Column="1"/>
</Border> </Grid>
<ItemsPresenter Name="PART_ItemsPresenter" </Border>
IsVisible="{TemplateBinding IsExpanded}" <ItemsPresenter Name="PART_ItemsPresenter"
Items="{TemplateBinding Items}" IsVisible="{TemplateBinding IsExpanded}"
ItemsPanel="{TemplateBinding ItemsPanel}" Items="{TemplateBinding Items}"
MemberSelector="{TemplateBinding MemberSelector}"/> ItemsPanel="{TemplateBinding ItemsPanel}"
</StackPanel> MemberSelector="{TemplateBinding MemberSelector}"/>
</ControlTemplate> </StackPanel>
</Setter> </ControlTemplate>
</Style> </Setter>
</Style>
<Style Selector="TreeViewItem /template/ ToggleButton#expander"> <Style Selector="TreeViewItem /template/ ToggleButton#expander">
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
<Border Background="Transparent" <Border Background="Transparent"
Width="14" Width="14"
Height="12" Height="12"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center"> VerticalAlignment="Center">
<Path Fill="{DynamicResource ThemeForegroundBrush}" <Path Fill="{DynamicResource ThemeForegroundBrush}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
Data="M 0 2 L 4 6 L 0 10 Z"/> Data="M 0 2 L 4 6 L 0 10 Z"/>
</Border> </Border>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
</Style> </Style>
<Style Selector="TreeViewItem /template/ ContentPresenter#PART_HeaderPresenter"> <Style Selector="TreeViewItem /template/ ContentPresenter#PART_HeaderPresenter">
<Setter Property="Padding" Value="2"/> <Setter Property="Padding" Value="2"/>
</Style> </Style>
<Style Selector="TreeViewItem[IsSelected=false] /template/ Border#SelectionBorder[IsPointerOver=true]">
<Setter Property="Background" Value="{DynamicResource ThemeControlHighlightMidBrush}"/>
</Style>
<Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder"> <Style Selector="TreeViewItem[IsSelected=false] /template/ Border#SelectionBorder[IsPointerOver=true]">
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush4}"/> <Setter Property="Background" Value="{DynamicResource ThemeControlHighlightMidBrush}"/>
</Style> </Style>
<Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=false][IsFocused=true]"> <Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder">
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush3}"/> <Setter Property="Background" Value="{DynamicResource ThemeAccentBrush4}"/>
</Style> </Style>
<Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=true][IsFocused=false]"> <Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=false][IsFocused=true]">
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush3}"/> <Setter Property="Background" Value="{DynamicResource ThemeAccentBrush3}"/>
</Style> </Style>
<Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=true][IsFocused=true]"> <Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=true][IsFocused=false]">
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush2}"/> <Setter Property="Background" Value="{DynamicResource ThemeAccentBrush3}"/>
</Style> </Style>
<Style Selector="TreeViewItem /template/ ToggleButton#expander:checked">
<Setter Property="RenderTransform">
<RotateTransform Angle="45"/>
</Setter>
</Style>
<Style Selector="TreeViewItem:empty /template/ ToggleButton#expander"> <Style Selector="TreeViewItem[IsSelected=true] /template/ Border#SelectionBorder[IsPointerOver=true][IsFocused=true]">
<Setter Property="IsVisible" Value="False"/> <Setter Property="Background" Value="{DynamicResource ThemeAccentBrush2}"/>
</Style> </Style>
<Style Selector="TreeViewItem /template/ ToggleButton#expander:checked">
<Setter Property="RenderTransform">
<RotateTransform Angle="45"/>
</Setter>
</Style>
<Style Selector="TreeViewItem:empty /template/ ToggleButton#expander">
<Setter Property="IsVisible" Value="False"/>
</Style>
</Styles> </Styles>

Loading…
Cancel
Save