Browse Source

Added ListBox.

And moved all item selecting logic etc in SelectingItemsControl where it
should be.
pull/10/head
Steven Kirk 12 years ago
parent
commit
9a1c5825d4
  1. 4
      Perspex.Controls/CheckBox.cs
  2. 13
      Perspex.Controls/ISelectable.cs
  3. 19
      Perspex.Controls/ListBox.cs
  4. 25
      Perspex.Controls/ListBoxItem.cs
  5. 3
      Perspex.Controls/Perspex.Controls.csproj
  6. 53
      Perspex.Controls/Primitives/SelectingItemsControl.cs
  7. 32
      Perspex.Controls/Primitives/TabStrip.cs
  8. 4
      Perspex.Controls/TabItem.cs
  9. 51
      Perspex.Controls/TreeView.cs
  10. 4
      Perspex.Controls/TreeViewItem.cs
  11. 2
      Perspex.Themes.Default/DefaultTheme.cs
  12. 57
      Perspex.Themes.Default/ListBoxItemStyle.cs
  13. 52
      Perspex.Themes.Default/ListBoxStyle.cs
  14. 2
      Perspex.Themes.Default/Perspex.Themes.Default.csproj
  15. 23
      TestApplication/Program.cs

4
Perspex.Controls/CheckBox.cs

@ -4,10 +4,10 @@
// </copyright>
// -----------------------------------------------------------------------
using Perspex.Controls.Primitives;
namespace Perspex.Controls
{
using Perspex.Controls.Primitives;
public class CheckBox : ToggleButton
{
}

13
Perspex.Controls/ISelectable.cs

@ -0,0 +1,13 @@
// -----------------------------------------------------------------------
// <copyright file="ISelectable.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
public interface ISelectable
{
bool IsSelected { get; set; }
}
}

19
Perspex.Controls/ListBox.cs

@ -0,0 +1,19 @@
// -----------------------------------------------------------------------
// <copyright file="ListBox.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
using Perspex.Controls.Generators;
using Perspex.Controls.Primitives;
public class ListBox : SelectingItemsControl
{
protected override ItemContainerGenerator CreateItemContainerGenerator()
{
return new TypedItemContainerGenerator<ListBoxItem>(this);
}
}
}

25
Perspex.Controls/ListBoxItem.cs

@ -0,0 +1,25 @@
// -----------------------------------------------------------------------
// <copyright file="ListBoxItem.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
public class ListBoxItem : ContentControl, ISelectable
{
public static readonly PerspexProperty<bool> IsSelectedProperty =
PerspexProperty.Register<ListBoxItem, bool>("IsSelected");
static ListBoxItem()
{
PseudoClass(IsSelectedProperty, ":selected");
}
public bool IsSelected
{
get { return this.GetValue(IsSelectedProperty); }
set { this.SetValue(IsSelectedProperty, value); }
}
}
}

3
Perspex.Controls/Perspex.Controls.csproj

@ -41,6 +41,9 @@
<Compile Include="ColumnDefinitions.cs" />
<Compile Include="ContentControl.cs" />
<Compile Include="GridSplitter.cs" />
<Compile Include="ISelectable.cs" />
<Compile Include="ListBoxItem.cs" />
<Compile Include="ListBox.cs" />
<Compile Include="Platform\IWindowImpl.cs" />
<Compile Include="Presenters\ScrollContentPresenter.cs" />
<Compile Include="Presenters\ContentPresenter.cs" />

53
Perspex.Controls/Primitives/SelectingItemsControl.cs

@ -6,15 +6,68 @@
namespace Perspex.Controls.Primitives
{
using System;
using System.Linq;
using Perspex.Controls.Presenters;
using Perspex.Input;
using Perspex.Interactivity;
public class SelectingItemsControl : ItemsControl
{
public static readonly PerspexProperty<object> SelectedItemProperty =
PerspexProperty.Register<SelectingItemsControl, object>("SelectedItem");
static SelectingItemsControl()
{
SelectedItemProperty.Changed.Subscribe(x =>
{
var control = x.Sender as SelectingItemsControl;
if (control != null)
{
control.SelectedItemChanged(x.NewValue);
}
});
}
public object SelectedItem
{
get { return this.GetValue(SelectedItemProperty); }
set { this.SetValue(SelectedItemProperty, value); }
}
protected override void OnPointerPressed(PointerEventArgs e)
{
IVisual source = (IVisual)e.Source;
var selectable = source.GetVisualAncestors()
.OfType<ISelectable>()
.OfType<Control>()
.FirstOrDefault();
if (selectable != null)
{
var container = this.ItemContainerGenerator.GetItemForContainer(selectable);
if (container != null)
{
this.SelectedItem = container;
}
}
}
private void SelectedItemChanged(object selected)
{
var containers = this.ItemContainerGenerator.GetAll()
.Select(x => x.Item2)
.OfType<ISelectable>();
var selectedContainer = (selected != null) ?
this.ItemContainerGenerator.GetContainerForItem(selected) :
null;
foreach (var item in containers)
{
item.IsSelected = item == selectedContainer;
}
}
}
}

32
Perspex.Controls/Primitives/TabStrip.cs

@ -23,12 +23,6 @@ namespace Perspex.Controls.Primitives
ItemsPanelProperty.OverrideDefaultValue(typeof(TabStrip), PanelTemplate);
}
public TabStrip()
{
this.PointerPressed += this.OnPointerPressed;
this.GetObservable(SelectedItemProperty).Subscribe(this.SelectedItemChanged);
}
protected override ItemContainerGenerator CreateItemContainerGenerator()
{
TabControl tabControl = this.TemplatedParent as TabControl;
@ -60,31 +54,5 @@ namespace Perspex.Controls.Primitives
this.SelectedItem = tabs.FirstOrDefault(x => x.IsSelected) ?? tabs.FirstOrDefault();
}
}
private void OnPointerPressed(object sender, PointerEventArgs e)
{
IVisual source = (IVisual)e.Source;
ContentPresenter presenter = source.GetVisualAncestors()
.OfType<ContentPresenter>()
.FirstOrDefault();
if (presenter != null)
{
TabItem item = presenter.TemplatedParent as TabItem;
if (item != null)
{
this.SelectedItem = item;
}
}
}
private void SelectedItemChanged(object selected)
{
foreach (TabItem item in this.ItemContainerGenerator.GetAll().Select(x => x.Item2))
{
item.IsSelected = selected == item;
}
}
}
}

4
Perspex.Controls/TabItem.cs

@ -8,10 +8,10 @@ namespace Perspex.Controls
{
using Perspex.Controls.Primitives;
public class TabItem : HeaderedContentControl
public class TabItem : HeaderedContentControl, ISelectable
{
public static readonly PerspexProperty<bool> IsSelectedProperty =
PerspexProperty.Register<TabItem, bool>("IsSelected");
ListBoxItem.IsSelectedProperty.AddOwner<TabItem>();
static TabItem()
{

51
Perspex.Controls/TreeView.cs

@ -15,38 +15,33 @@ namespace Perspex.Controls
public class TreeView : SelectingItemsControl
{
public TreeView()
{
this.PointerPressed += this.OnPointerPressed;
}
protected override ItemContainerGenerator CreateItemContainerGenerator()
{
return new TreeItemContainerGenerator<TreeViewItem>(this);
}
private void OnPointerPressed(object sender, PointerEventArgs e)
{
IVisual source = (IVisual)e.Source;
ContentPresenter contentPresenter = source.GetVisualAncestors()
.OfType<ContentPresenter>()
.FirstOrDefault();
if (contentPresenter != null)
{
TreeViewItem container = contentPresenter.TemplatedParent as TreeViewItem;
if (container != null)
{
foreach (var i in this.GetVisualDescendents().OfType<TreeViewItem>())
{
i.IsSelected = i == container;
}
this.SelectedItem = this.ItemContainerGenerator.GetItemForContainer(container);
}
}
}
//protected override void OnPointerPressed(PointerEventArgs e)
//{
// IVisual source = (IVisual)e.Source;
// ContentPresenter contentPresenter = source.GetVisualAncestors()
// .OfType<ContentPresenter>()
// .FirstOrDefault();
// if (contentPresenter != null)
// {
// TreeViewItem container = contentPresenter.TemplatedParent as TreeViewItem;
// if (container != null)
// {
// foreach (var i in this.GetVisualDescendents().OfType<TreeViewItem>())
// {
// i.IsSelected = i == container;
// }
// this.SelectedItem = this.ItemContainerGenerator.GetItemForContainer(container);
// }
// }
//}
}
}

4
Perspex.Controls/TreeViewItem.cs

@ -11,13 +11,13 @@ namespace Perspex.Controls
using Perspex.Controls.Generators;
using Perspex.Controls.Primitives;
public class TreeViewItem : HeaderedItemsControl
public class TreeViewItem : HeaderedItemsControl, ISelectable
{
public static readonly PerspexProperty<bool> IsExpandedProperty =
PerspexProperty.Register<TreeViewItem, bool>("IsExpanded");
public static readonly PerspexProperty<bool> IsSelectedProperty =
PerspexProperty.Register<TreeViewItem, bool>("IsSelected");
ListBoxItem.IsSelectedProperty.AddOwner<TreeViewItem>();
TreeView treeView;

2
Perspex.Themes.Default/DefaultTheme.cs

@ -17,6 +17,8 @@ namespace Perspex.Themes.Default
this.Add(new ContentControlStyle());
this.Add(new GridSplitterStyle());
this.Add(new ItemsControlStyle());
this.Add(new ListBoxStyle());
this.Add(new ListBoxItemStyle());
this.Add(new ScrollBarStyle());
this.Add(new ScrollViewerStyle());
this.Add(new TabControlStyle());

57
Perspex.Themes.Default/ListBoxItemStyle.cs

@ -0,0 +1,57 @@
// -----------------------------------------------------------------------
// <copyright file="ListBoxItemStyle.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Controls.Shapes;
using Perspex.Styling;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
public class ListBoxItemStyle : Styles
{
public ListBoxItemStyle()
{
this.AddRange(new[]
{
new Style(x => x.OfType<ListBoxItem>())
{
Setters = new[]
{
new Setter(ListBoxItem.TemplateProperty, ControlTemplate.Create<ListBoxItem>(this.Template)),
},
},
new Style(x => x.OfType<ListBoxItem>().Class(":selected").Template().Id("border"))
{
Setters = new[]
{
new Setter(ListBoxItem.BackgroundProperty, new SolidColorBrush(0xff086f9e)),
new Setter(ListBoxItem.ForegroundProperty, Brushes.White),
},
},
});
}
private Control Template(ListBoxItem control)
{
return new Border
{
Id = "border",
[~Border.BackgroundProperty] = control[~ListBoxItem.BackgroundProperty],
[~Border.BorderBrushProperty] = control[~ListBoxItem.BorderBrushProperty],
[~Border.BorderThicknessProperty] = control[~ListBoxItem.BorderThicknessProperty],
Content = new ContentPresenter
{
[~ContentPresenter.ContentProperty] = control[~ListBoxItem.ContentProperty],
},
};
}
}
}

52
Perspex.Themes.Default/ListBoxStyle.cs

@ -0,0 +1,52 @@
// -----------------------------------------------------------------------
// <copyright file="ListBoxStyle.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Media;
using Perspex.Styling;
public class ListBoxStyle : Styles
{
public ListBoxStyle()
{
this.AddRange(new[]
{
new Style(x => x.OfType<ListBox>())
{
Setters = new[]
{
new Setter(ListBox.TemplateProperty, ControlTemplate.Create<ListBox>(this.Template)),
new Setter(ListBox.BorderBrushProperty, Brushes.Black),
new Setter(ListBox.BorderThicknessProperty, 1.0),
},
},
});
}
private Control Template(ListBox control)
{
return new Border
{
Padding = new Thickness(4),
[~Border.BackgroundProperty] = control[~ListBox.BackgroundProperty],
[~Border.BorderBrushProperty] = control[~ListBox.BorderBrushProperty],
[~Border.BorderThicknessProperty] = control[~ListBox.BorderThicknessProperty],
Content = new ScrollViewer
{
Content = new ItemsPresenter
{
[~ItemsPresenter.ItemsProperty] = control[~ListBox.ItemsProperty],
[~ItemsPresenter.ItemsPanelProperty] = control[~ListBox.ItemsPanelProperty],
}
}
};
}
}
}

2
Perspex.Themes.Default/Perspex.Themes.Default.csproj

@ -66,6 +66,8 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="ListBoxStyle.cs" />
<Compile Include="ListBoxItemStyle.cs" />
<Compile Include="WindowStyle.cs" />
<Compile Include="ScrollViewerStyle.cs" />
<Compile Include="ScrollBarStyle.cs" />

23
TestApplication/Program.cs

@ -87,6 +87,13 @@ namespace TestApplication
},
};
private static PerspexList<Item> listBoxData = new PerspexList<Item>
{
new Item { Name = "Item 1", Value = "Item 1 Value" },
new Item { Name = "Item 2", Value = "Item 2 Value" },
new Item { Name = "Item 3", Value = "Item 3 Value" },
};
static void Main(string[] args)
{
//LogManager.Enable(new TestLogger());
@ -264,6 +271,22 @@ namespace TestApplication
Id = "treeView",
Items = treeData,
},
new ListBox
{
DataTemplates = new DataTemplates
{
new DataTemplate<Item>(x =>
new StackPanel
{
Children = new Controls
{
new TextBlock { Text = x.Name, FontSize = 24 },
new TextBlock { Text = x.Value },
}
})
},
Items = listBoxData,
}
}
},
};

Loading…
Cancel
Save