WPF通过MVVM禁用窗口关闭按钮

时间:2014-06-24 06:45:36

标签: c# wpf mvvm

我试图通过MVVM禁用窗口上的关闭按钮

我意识到你可以通过陈述

在视图(窗口)CS代码中执行此操作
public Window()
{
    InitializeComponent();
    this.Closing += new System.ComponentModel.CancelEventHandler(Window_Closing);
}

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

但是我想保持一致,并尝试这样做是MVVM。

谢谢

3 个答案:

答案 0 :(得分:1)

这是一个奇怪的需求。如果你有一个关闭按钮,为什么你禁用它的功能。但你可以用这样的mvvm来实现它:

添加两个参考: - Microsoft.Expression.Interactions.dll - System.Windows.Interactivity.dll

添加两个xmlns:

 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 :(得分:0)

您可以使用Window的ResizeMode,也可以使用Window API使用Window API mentioend Here

来使用它

答案 2 :(得分:0)

使用ViewModel中的变量更改Closing方法。

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;
}

如果要在UI的某个位置显示后台进程的状态,则可以在修改RaisePropertyChange()时添加this.processWorking