175 lines
4.7 KiB
C#
175 lines
4.7 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Media.Animation;
|
|
|
|
namespace BeWo.Controls
|
|
{
|
|
[TemplatePart(Name = "PART_Border", Type = typeof(Border))]
|
|
[TemplatePart(Name = "PART_Header", Type = typeof(Grid))]
|
|
[TemplatePart(Name = "PART_Content", Type = typeof(Grid))]
|
|
[ContentProperty("Content")]
|
|
[DefaultProperty("Content")]
|
|
public class ExpanderPanel : Control
|
|
{
|
|
private Border mBorder;
|
|
|
|
private UIElement mContent;
|
|
|
|
private Grid mContentGrid;
|
|
|
|
private bool mExpanded;
|
|
|
|
private UIElement mHeader;
|
|
|
|
private Grid mHeaderGrid;
|
|
|
|
private double mHeight;
|
|
|
|
private double mMinHeight = 30;
|
|
|
|
static ExpanderPanel()
|
|
{
|
|
DefaultStyleKeyProperty.OverrideMetadata(typeof(ExpanderPanel), new FrameworkPropertyMetadata(typeof(ExpanderPanel)));
|
|
}
|
|
|
|
public ExpanderPanel()
|
|
{
|
|
this.Loaded += this.ExpanderPanel_Loaded;
|
|
}
|
|
|
|
[Bindable(true)]
|
|
public UIElement Content
|
|
{
|
|
get
|
|
{
|
|
return this.mContent;
|
|
}
|
|
|
|
set
|
|
{
|
|
this.mContent = value;
|
|
this.ApplyContent();
|
|
}
|
|
}
|
|
|
|
[Bindable(true)]
|
|
public UIElement Header
|
|
{
|
|
get
|
|
{
|
|
return this.mHeader;
|
|
}
|
|
|
|
set
|
|
{
|
|
this.mHeader = value;
|
|
this.ApplyHeader();
|
|
}
|
|
}
|
|
|
|
[Bindable(true)]
|
|
public bool IsExpanded
|
|
{
|
|
get
|
|
{
|
|
return this.mExpanded;
|
|
}
|
|
|
|
set
|
|
{
|
|
this.UpdateExpander();
|
|
this.mExpanded = value;
|
|
}
|
|
}
|
|
|
|
public override void OnApplyTemplate()
|
|
{
|
|
base.OnApplyTemplate();
|
|
|
|
this.mHeaderGrid = this.GetTemplateChild("PART_Header") as Grid;
|
|
this.mContentGrid = this.GetTemplateChild("PART_Content") as Grid;
|
|
this.mBorder = this.GetTemplateChild("PART_Border") as Border;
|
|
|
|
this.ApplyContent();
|
|
this.ApplyHeader();
|
|
}
|
|
|
|
protected override void OnInitialized(EventArgs e)
|
|
{
|
|
base.OnInitialized(e);
|
|
}
|
|
|
|
private void ApplyContent()
|
|
{
|
|
if (this.mContentGrid != null)
|
|
{
|
|
this.mContentGrid.Children.Clear();
|
|
if (this.mContent != null)
|
|
{
|
|
this.mContentGrid.Children.Add(this.mContent);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ApplyHeader()
|
|
{
|
|
if (this.mHeaderGrid != null)
|
|
{
|
|
this.mHeaderGrid.Children.Clear();
|
|
if (this.mHeader != null)
|
|
{
|
|
this.mHeaderGrid.Children.Add(this.mHeader);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CollapsePanel()
|
|
{
|
|
if (this.mBorder != null)
|
|
{
|
|
DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames();
|
|
animation.KeyFrames.Add(new SplineDoubleKeyFrame(this.mMinHeight, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 300)), new KeySpline(1, 0, 1, 1)));
|
|
|
|
this.mBorder.BeginAnimation(HeightProperty, animation);
|
|
}
|
|
}
|
|
|
|
private void ExpandPanel()
|
|
{
|
|
if (this.mBorder != null)
|
|
{
|
|
DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames();
|
|
animation.KeyFrames.Add(new SplineDoubleKeyFrame(this.mHeight, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 300)), new KeySpline(1, 0, 1, 1)));
|
|
|
|
this.mBorder.BeginAnimation(HeightProperty, animation);
|
|
}
|
|
}
|
|
|
|
private void ExpanderPanel_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
if (this.mBorder != null && this.mHeight == 0)
|
|
{
|
|
this.mHeight = this.mBorder.ActualHeight;
|
|
if (this.mHeight > 0)
|
|
{
|
|
this.mBorder.Height = this.mHeight;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateExpander()
|
|
{
|
|
if (this.mExpanded)
|
|
{
|
|
this.ExpandPanel();
|
|
}
|
|
else
|
|
{
|
|
this.CollapsePanel();
|
|
}
|
|
}
|
|
}
|
|
} |