web-dev-qa-db-fra.com

bouton de fermeture de la fenêtre de traitement dans wpf MVVM

existe-t-il un moyen de gérer le bouton de fermeture de la fenêtre, par exemple "X" dans le coin supérieur droit du modèle de vue en le liant à une commande? ou en remplaçant la commande window.close afin que la fermeture d'une fenêtre retourne à la fenêtre précédente. Merci.

18
Andris Mudiayi

Il existe plusieurs méthodes pour cela. J'ai indiqué deux méthodes ci-dessous.

  1. Vous pouvez utiliser les commandes attachées pour lier le bouton de fermeture dans votre modèle de vue.

  2. Vous pouvez utiliser le code ci-dessous

Xaml:

<Window x:Class="WpfInfragisticsModal.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        xmlns:ig="http://schemas.infragistics.com/xaml"
        xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"
        Name="myWindow">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding CloseWindowCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
    </Grid>
</Window>

REMARQUE: Ajouter une référence System.Windows.Interactivity

Voir le modèle

private ICommand closeWindowCommand;

public ICommand CloseWindowCommand
{
      get
      {
          if (closeWindowCommand == null)
          {
             closeWindowCommand = new RelayCommand(param => this.CloseWindow(), null);
          }
          return closeWindowCommand;
      }
 }

private void CloseWindow()
{
     //Do your operations
}

Ceci est ma classe RelayCommand.

public class RelayCommand : ICommand
{
    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    /// <param name="canExecute">The can execute.</param>
    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    /// <summary>
    /// Defines the method that determines whether the command can execute in its current state.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    /// <returns>
    /// true if this command can be executed; otherwise, false.
    /// </returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    /// <summary>
    /// Occurs when changes occur that affect whether or not the command should execute.
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    /// <summary>
    /// Defines the method to be called when the command is invoked.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    /// <summary>
    /// Action
    /// </summary>
    private readonly Action<object> _execute;


    /// <summary>
    /// Predicate
    /// </summary>
    private readonly Predicate<object> _canExecute;
}
31
Haritha

le problème était que je fermais une fenêtre parent et que je la rouvrais après la fermeture de sa fenêtre enfant respective, ce qui provoquait des fuites de mémoire. J'ai résolu le problème en masquant la fenêtre parent, puis en l'affichant à nouveau après la fermeture de la fenêtre enfant. Je suis nouveau sur wpf et le développement de windows, donc j'apprends comme je vais.

1
Andris Mudiayi