#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 упомянуто здесь