WPF отключает кнопку закрытия окна с помощью MVVM

#c# #wpf #mvvm

#c# #wpf #mvvm

Вопрос:

Я пытаюсь отключить кнопку закрытия окна через MVVM

Я понимаю, что вы можете сделать это в коде CS view (window), указав

 public Window()
{
    InitializeComponent();
    this.Closing  = new System.ComponentModel.CancelEventHandler(Window_Closing);
}

void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    e.Cancel = true;
}
 

Однако я хотел бы сохранить его согласованным и попытаться сделать это с помощью MVVM.

Спасибо

Комментарии:

1. почему вы так это делаете? У вас есть кнопка закрытия, и вы отключаете ее функцию, так почему бы не сделать ее скрытой?

2. Просто потому, что я запускаю фоновый поток, поэтому мне нужно запретить пользователю запускать события во время выполнения потока, как только поток завершится, я, конечно, включу его обратно

Ответ №1:

Это странное требование. Если у вас есть кнопка закрытия, почему вы отключаете ее функцию. Но вы можете реализовать это с помощью mvvm следующим образом:

добавьте две ссылки: — Microsoft.Expression .Interactions.dll — Система.Windows.Interactivity.dll

добавьте два xmln:

  xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
 xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
 

создать триггер для окна:

  <Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:control="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        Title="MainWindow" Height="350" Width="525">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <ei:CallMethodAction TargetObject="{Binding}" MethodName="WindowsClosing"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid >

    </Grid>
</Window>
 

отредактируйте viewmodel и создайте функцию закрытия:

  public void WindowsClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
        }
 

Комментарии:

1. Спасибо, это выглядит хорошо. Будет и попробуйте отметить как ответ когда-нибудь сегодня. Это потому, что я запускаю фоновый поток, поэтому мне нужно запретить пользователю запускать события по мере выполнения потока, как только поток завершится, конечно, я включу его обратно

2. @user3428422 Теперь я вижу! кстати, для взаимодействия требуется как минимум .net4.0.

Ответ №2:

Измените свой Closing метод с помощью переменной из ViewModel.

 void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    e.Cancel = (this.DataContext as MyViewModel).ProcessWorking;
}
 

В вашей ViewModel ( MyViewModel ) добавьте свойство ProcessWorking :

 public Boolean ProcessWorking
{
    get { return this.processWorking; }
}
 

и в вашем методе фонового потока просто измените processWorking

 private Boolean processWorking;

private void MyBackgroundThread()
{
    this.processWorking = true;

    // do your process

    this.processWorking = false;
}
 

Вы можете добавить a RaisePropertyChange() при изменении this.processWorking , если хотите показать где-нибудь в своем пользовательском интерфейсе состояние фонового процесса.

Ответ №3:

вы можете использовать ResizeMode из Window или вы можете использовать его с помощью Window API использование Window API упомянуто здесь