StackPanel /窗口宽度更改WPF
本文关键字:WPF 窗口 StackPanel | 更新日期: 2023-09-27 18:11:21
我已经创建了一个窗口,其中两个垂直方向的堆栈面板(左和右)位于第三个水平方向的堆栈面板中。左边的堆叠面板上有多个控件和一个按钮>Hide<,绑定到命令。我喜欢动画"隐藏"右堆栈面板,并调整窗口的宽度,只有左堆栈面板。如何用最简单的方式做到这一点?我发现WPF堆栈面板的可见性动画,但是,它不会调整窗口的大小。
我的代码是:<Window x:Class="Namespace.MainWindow"
...
x:Name="ololo"
Height="400" Width="500">
.....
<StackPanel Orientation="Horizontal">
<StackPanel x:Name="Left" Orientation="Vertical">
<Button Margin="0,10,0,0" Command="{Binding HideCommand}">Hide</Button>
</StackPanel>
<StackPanel x:Name="Right" Orientation="Vertical">
<!--<Controls>-->
</StackPanel>
</StackPanel>
您可以在Window
上使用SizeToContent
属性,以便在内容更改时自动调整窗口大小。
我建议使用Width
值。
<Window ...
SizeToContent="Width"
然而,有一个问题,这是你可能需要指定每个StackPanel
的宽度,或者可能设置一个MinWidth
在你的窗口,以防止Window
从大小调整为0的宽度。
通常动画是在视图中完成的,ViewModel不应该与窗口的大小有任何关系。因此,为了保留MVVM,您只需要调整后面代码的大小。这通常是通过查找动画资源来实现的。
<Storyboard x:Key="AnimateWindow">
<DoubleAnimation Duration="0:0:3.8"
Storyboard.TargetProperty="Width"
From="350"
To="100"
AccelerationRatio=".1">
</DoubleAnimation>
</Storyboard>
在按钮点击时,你还需要处理点击事件来触发动画。click事件将查找资源并执行它。它还可以处理您需要的任何其他特定于视图的事情。
private void Button_Click(object sender, RoutedEventArgs e)
{
var animate= FindResource("AnimateWindow") as Storyboard;
if (hide != null)
{
animate.Begin(this, true);
}
}
这保留了MVVM,并且应该完成您想要的。