Stylet/Samples/Stylet.Samples.RedditBrowser/UserControls/StretchingTreeView.cs

86 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
namespace Stylet.Samples.RedditBrowser.UserControls
{
// http://blogs.msdn.com/b/jpricket/archive/2008/08/05/wpf-a-stretching-treeview.aspx
public class StretchingTreeView : TreeView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new StretchingTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is StretchingTreeViewItem;
}
}
public class StretchingTreeViewItem : TreeViewItem
{
public StretchingTreeViewItem()
{
this.Loaded += new RoutedEventHandler(StretchingTreeViewItem_Loaded);
}
private void StretchingTreeViewItem_Loaded(object sender, RoutedEventArgs e)
{
// The purpose of this code is to stretch the Header Content all the way accross the TreeView.
if (this.VisualChildrenCount > 0)
{
Grid grid = this.GetVisualChild(0) as Grid;
if (grid != null && grid.ColumnDefinitions.Count == 3)
{
// Remove the middle column which is set to Auto and let it get replaced with the
// last column that is set to Star.
grid.ColumnDefinitions.RemoveAt(1);
}
}
}
protected override DependencyObject GetContainerForItemOverride()
{
return new StretchingTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is StretchingTreeViewItem;
}
// http://stackoverflow.com/a/2957734/1086121
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (Template != null)
{
var btn = Template.FindName("Expander", this) as ToggleButton;
if (btn != null)
btn.VerticalAlignment = this.ToggleButtonVerticalAlignment;
}
}
public VerticalAlignment ToggleButtonVerticalAlignment
{
get { return (VerticalAlignment)GetValue(ToggleButtonVerticalAlignmentProperty); }
set { SetValue(ToggleButtonVerticalAlignmentProperty, value); }
}
// Using a DependencyProperty as the backing store for ToggleButtonVerticalAlignment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ToggleButtonVerticalAlignmentProperty =
DependencyProperty.Register("ToggleButtonVerticalAlignment", typeof(VerticalAlignment), typeof(StretchingTreeViewItem), new PropertyMetadata(VerticalAlignment.Center));
}
}