Browse Source

Allow selection of tree view items.

pull/4/head
Steven Kirk 12 years ago
parent
commit
3827459f99
  1. 26
      Perspex/Controls/TreeView.cs
  2. 15
      Perspex/Controls/TreeViewItem.cs
  3. 9
      Perspex/Themes/Default/TreeViewItemStyle.cs
  4. 1
      Perspex/Themes/Default/TreeViewStyle.cs
  5. 1
      TestApplication/Program.cs

26
Perspex/Controls/TreeView.cs

@ -10,9 +10,15 @@ namespace Perspex.Controls
using System.Collections;
using System.Linq;
using System.Reactive.Linq;
using Perspex.Input;
public class TreeView : SelectingItemsControl
{
public TreeView()
{
this.PointerPressed += this.OnPointerPressed;
}
protected override Control CreateItemControlOverride(object item)
{
TreeViewItem result = item as TreeViewItem;
@ -44,5 +50,25 @@ namespace Perspex.Controls
return treeTemplate;
}
private void OnPointerPressed(object sender, PointerEventArgs e)
{
IVisual source = (IVisual)e.Source;
ContentPresenter contentPresenter = source.GetVisualAncestor<ContentPresenter>();
if (contentPresenter != null)
{
TreeViewItem item = contentPresenter.TemplatedParent as TreeViewItem;
if (item != null)
{
foreach (var i in this.GetVisualDescendents().OfType<TreeViewItem>())
{
i.IsSelected = i == item;
}
}
}
}
}
}

15
Perspex/Controls/TreeViewItem.cs

@ -11,14 +11,29 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsExpandedProperty =
PerspexProperty.Register<TreeViewItem, bool>("IsExpanded");
public static readonly PerspexProperty<bool> IsSelectedProperty =
PerspexProperty.Register<TreeViewItem, bool>("IsSelected");
TreeView parent;
public TreeViewItem()
{
this.AddPseudoClass(IsSelectedProperty, ":selected");
AffectsRender(IsSelectedProperty);
}
public bool IsExpanded
{
get { return this.GetValue(IsExpandedProperty); }
set { this.SetValue(IsExpandedProperty, value); }
}
public bool IsSelected
{
get { return this.GetValue(IsSelectedProperty); }
set { this.SetValue(IsSelectedProperty, value); }
}
protected override Control CreateItemControlOverride(object item)
{
if (this.parent != null)

9
Perspex/Themes/Default/TreeViewItemStyle.cs

@ -26,6 +26,14 @@ namespace Perspex.Themes.Default
new Setter(Button.TemplateProperty, ControlTemplate.Create<TreeViewItem>(this.Template)),
},
},
new Style(x => x.OfType<TreeViewItem>().Class(":selected").Template().OfType<ContentPresenter>())
{
Setters = new[]
{
new Setter(TreeViewItem.BackgroundProperty, new SolidColorBrush(0xff086f9e)),
new Setter(TreeViewItem.ForegroundProperty, Brushes.White),
},
},
new Style(x => x.OfType<TreeViewItem>().Template().OfType<ToggleButton>().Class("expander"))
{
Setters = new[]
@ -65,6 +73,7 @@ namespace Perspex.Themes.Default
},
new ContentPresenter
{
[~ContentPresenter.BackgroundProperty] = control[~TreeViewItem.BackgroundProperty],
[Grid.ColumnProperty] = 1,
[~ContentPresenter.ContentProperty] = control[~TreeViewItem.HeaderProperty],
},

1
Perspex/Themes/Default/TreeViewStyle.cs

@ -33,6 +33,7 @@ namespace Perspex.Themes.Default
{
return new Border
{
Padding = new Thickness(4),
[~Border.BackgroundProperty] = control[~TreeView.BackgroundProperty],
[~Border.BorderBrushProperty] = control[~TreeView.BorderBrushProperty],
[~Border.BorderThicknessProperty] = control[~TreeView.BorderThicknessProperty],

1
TestApplication/Program.cs

@ -180,7 +180,6 @@ namespace TestApplication
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Gap = 8,
Width = 120,
Children = new Controls
{
new TreeView

Loading…
Cancel
Save