當前位置:編程學習大全網 - 遊戲軟體 - wpf 如何動態的設置Grid寬和高.

wpf 如何動態的設置Grid寬和高.

WPF動態改變grid行寬或者列高,需要創建GridLength的動畫類。

(壹) 創建壹個支持GridLength類型的動畫類

新建壹個繼承AnimationTimeLine的類GridLengthAnimation, 簡單實現2個依賴屬性"From", "To".代碼如下:

internal class GridLengthAnimation : AnimationTimeline

{

static GridLengthAnimation()

{

FromProperty = DependencyProperty.Register("From", typeof(GridLength),

typeof(GridLengthAnimation));

ToProperty = DependencyProperty.Register("To", typeof(GridLength),

typeof(GridLengthAnimation));

}

public static readonly DependencyProperty FromProperty;

public GridLength From

{

get

{

return (GridLength)GetValue(GridLengthAnimation.FromProperty);

}

set

{

SetValue(GridLengthAnimation.FromProperty, value);

}

}

public static readonly DependencyProperty ToProperty;

public GridLength To

{

get

{

return (GridLength)GetValue(GridLengthAnimation.ToProperty);

}

set

{

SetValue(GridLengthAnimation.ToProperty, value);

}

}

接下來就來依次重載或者實現AnimationTimeLine類的成員,

1. 重載CreateInstanceCore, 代碼如下:

protected override System.Windows.Freezable CreateInstanceCore()

{

return new GridLengthAnimation();

}

2. 重載GetCurrentValue以返回動畫的當前值, 代碼如下:

public override object GetCurrentValue(object defaultOriginValue,

object defaultDestinationValue, AnimationClock animationClock)

{

double fromVal = ((GridLength)GetValue(GridLengthAnimation.FromProperty)).Value;

double toVal = ((GridLength)GetValue(GridLengthAnimation.ToProperty)).Value;

if (fromVal > toVal)

{

return new GridLength((1 - animationClock.CurrentProgress.Value) * (fromVal - toVal) + toVal,

((GridLength)GetValue(GridLengthAnimation.FromProperty)).GridUnitType);

}

else

return new GridLength(animationClock.CurrentProgress.Value * (toVal - fromVal) + fromVal,

((GridLength)GetValue(GridLengthAnimation.ToProperty)).GridUnitType);

}

3. 重寫TargetPropertyType 屬性以指示相應的動畫所生成輸出的Type, 代碼如下:

public override Type TargetPropertyType

{

get

{

return typeof(GridLength);

}

}

ok, 通過上面的步驟我們已經寫好了GridLengthAnimation類, 接下來就是如何使用此類.

(二)xaml使用此類, 代碼如下:

<Window.Resources>

<Storyboard x:Key="sbDock">

<common:GridLengthAnimation BeginTime="00:00:00" Storyboard.TargetName="_cellLeft" Storyboard.TargetProperty="Width">

</common:GridLengthAnimation>

</Storyboard>

</Window.Resources>

<Grid x:Name="LayoutRoot" Background="White">

<Grid.RowDefinitions>

<RowDefinition/>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition x:Name="_cellLeft" Width="300"/>

<ColumnDefinition x:Name="_cellRight" Width="*"/>

</Grid.ColumnDefinitions>

</Grid>

(三)c#使用此類, 代碼如下:

Storyboard sbDock = this.FindResource("sbDock") as Storyboard;

if (sbDock != null)

{

SplineDoubleKeyFrame sdKeyFrame1 = new SplineDoubleKeyFrame(TransformRadius,

KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)));

(sbDock.Children[0] as DoubleAnimationUsingKeyFrames).KeyFrames.Clear();

(sbDock.Children[0] as DoubleAnimationUsingKeyFrames).KeyFrames.Add(sdKeyFrame1);

(sbDock.Children[1] as GridLengthAnimation).From = new GridLength(300, GridUnitType.Pixel);

(sbDock.Children[1] as GridLengthAnimation).To = new GridLength(0, GridUnitType.Pixel);

sbDock.Begin();

}

  • 上一篇:哆啦A夢:大雄的恐龍的介紹
  • 下一篇:傳奇世界幻境迷宮怎麽走?本人新手什麽左上右下我不太懂,麻煩從壹層到最底層的詳細走法說壹下。
  • copyright 2024編程學習大全網