我有一个故事板,当按下togglebutton时,我用来更改网格的大小,但是网格的高度是硬编码的。如何根据其他元素设置其高度,但还会在其中添加额外的像素?更具体地说,我希望电网崩溃时的网格为50pt,但是扩展时应该是另一个元素的50pt 高度(将在网格中显示,在额外的空间中)。
<Style TargetType="{x:Type Grid}" x:Key="ExpandCollapseTopBar">
<Style.Triggers>
<EventTrigger RoutedEvent="ToggleButton.Checked">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Grid.Height)" From="50.0" To="100.0" Duration="0:0:0.1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Grid.Height)" From="100.0" To="50.0" Duration="0:0:0.1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
我将使用绑定到另一个元素的高度,但是我无法添加多余的像素。
Height="{Binding ElementName=TheOtherElement, Path=ActualHeight}"
通过处理 ToggleButton.Checked
和 ToggleButton.UnChecked
的 Grid
事件来应用动画编程:
private void Grid_Checked(object sender, RoutedEventArgs e)
{
Storyboard sb = new Storyboard();
double height = 100; //set whatever height you want here
DoubleAnimation animation = new DoubleAnimation() { From = 50.0, To = height, Duration = TimeSpan.FromSeconds(1) };
Storyboard.SetTargetProperty(animation, new PropertyPath("(Grid.Height)"));
Storyboard.SetTarget(animation, sender as Grid);
sb.Children.Add(animation);
sb.Begin();
}
然后,您可以根据需要计算高度。您不能用 markup 语言(例如xaml。
)执行此操作。这不会以任何方式打破MVVM。MVVM是不是从视图中消除与视图相关的代码。这是关于关注的分离。
您可以使用像CalcBinding这样的库,该库会创建绑定的标记扩展名来执行此操作。
我没有尝试过,但是应该这样起作用:
Height="{calc:Binding ElementName=TheOtherElement, Path=ActualHeight + 50}"
如果您不想依靠外部库,那么要使用的方法是使用Converter
,它会添加额外的像素。要做这样简单的事情,这是我要遵循的路线。