Вы можете обработать событие PropertyChanged
для модели представления и запустить анимацию программно в представлении:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}
private MainViewModel ViewModel => DataContext as MainViewModel;
private void OnLoaded(object sender, RoutedEventArgs e) =>
ViewModel.PropertyChanged += ViewModel_PropertyChanged;
private void OnUnloaded(object sender, RoutedEventArgs e) =>
ViewModel.PropertyChanged += ViewModel_PropertyChanged;
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) =>
BottomPanel.BeginAnimation(HeightProperty, new DoubleAnimation()
{
To = ViewModel.TargetHeight,
Duration = TimeSpan.FromSeconds(0.3)
});
}
То, что вы можете реализовать такие вещи, как анимации, в чистом XAML, это не значит, чточто вы всегда должны.Это пример, в котором имеет смысл реализовать логику представления с использованием выразительного языка программирования, такого как C #, вместо использования языка разметки, например XAML.
Возможно, вы также захотите указать фактическую высоту в представлении.и привязать к свойству IsBottomOpened
:
<Grid x:Name="BottomPanel" Background="Yellow" Height="0" Width="200">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding IsBottomOpened}">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Height"
To="128"
Duration="0:0:0.3" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
Если вы сделаете это, вы также можете заменить элемент Button
на ToggleButton
и привязать к его свойству IsChecked
вместо использованияIsBottomOpened
свойство источника.Нужны ли вам эти свойства в модели представления, зависит от ваших требований.