Как сделать кнопку "Свернуть", которая при нажатии свернет Expander(Expander.IsExpaneded = false)?
Есть Expander. Внутри него лежит кнопка Button. При нажатии на эту кнопку я хочу чтобы Expander свернулся. То есть Expander.IsExpaneded = false. Это нужно сделать в XAML.
Я попробовал это реализовать сам:
<Expander x:Name="Expander" Padding="10">
<Button Content="Свернуть" HorizontalAlignment="Right">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard TargetName="Expander" TargetProperty="IsExpanded">
<BooleanAnimationUsingKeyFrames BeginTime="0">
<DiscreteBooleanKeyFrame Value="False"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</Expander>
При нажатии Expander сворачивается, но после его нельзя развернуть при нажатии на его "стрелочку".
Помогите, пожалуйста!
Ответы (1 шт):
Почему анимация? Видно, что она отрабатывает с задержкой.
К сожалению, я слабо знаком с анимациями, может быть кто-то еще подскажет, в чем именно проблема.
Вот рабочая MVVM альтернатива с использованием команды для кнопки. Проверил, работает. На гениальность не претендую, возможно существует более оптимальное решение для вашей задачи.
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
Title="MainWindow" Height="300" Width="400">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Expander x:Name="Expander" Padding="10" IsExpanded="{Binding Expanded}">
<Button Content="Свернуть" HorizontalAlignment="Right" Command="{Binding CmdCollapse}"/>
</Expander>
</Grid>
</Window>
Для команд использую стандартную реализацию RelayCommand из туториала.
RelayCommand.cs
public class RelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
public void Execute(object parameter) => _execute(parameter);
}
В xaml я прибиндил IsExpanded к свойству класса MainViewModel.Expanded, и с использованием CmdCollapse команды меняю его значение на false.
MainViewModel.cs
public class MainViewModel : INotifyPropertyChanged
{
private bool _expanded;
public bool Expanded
{
get => _expanded;
set
{
_expanded = value;
OnPropertyChanged(nameof(Expanded));
}
}
public ICommand CmdCollapse => new RelayCommand(obj =>
{
Expanded = false;
});
public MainViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}