C# 如何建立我自己的关闭按钮?

C# 如何建立我自己的关闭按钮?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个带有MVVM的wpf应用程序。我试图在这里建立我自己的关闭按钮。基于这个答案,我在视图(xaml.cs)代码中添加了一个按钮事件处理程序。但是,它无法识别Close()调用(上下文中不存在-无法解析符号) 我还尝试了另一个答案,并将命令和命令参数添加到按钮的xaml中。但其背后的功能并没有获得成功。在使用RelayCommand时,我的wpf也无法识别RelayCommand。然后说我必须自己写(真的?)。我记得有一种简单的方法,类似于为按钮设置事件处理程序并调用Close()。但是,我

我有一个带有MVVM的wpf应用程序。我试图在这里建立我自己的关闭按钮。基于这个答案,我在视图(xaml.cs)代码中添加了一个按钮事件处理程序。但是,它无法识别
Close()调用(上下文中不存在-无法解析符号)

我还尝试了另一个答案,并将
命令
命令参数
添加到按钮的xaml中。但其背后的功能并没有获得成功。在使用
RelayCommand
时,我的wpf也无法识别
RelayCommand
。然后说我必须自己写(真的?)。我记得有一种简单的方法,类似于为按钮设置事件处理程序并调用
Close()。但是,我如何才能做到这一点,或者为什么它对我不起作用

查看代码:

private void closeButton_Click(object sender, RoutedEventArgs e)
{
    // I want to call close the whole app on button click
    //Close(); is not recognized
}

private void performMainCloseButtonCommand(object Parameter)
{
    // This doesn't get hits on button click
    Window objWindow = Parameter as Window;
    objWindow.Close();
}
按钮XAML:

        <Button x:Name="closeButton" RenderTransformOrigin="0.5,0.5" Padding="0" Margin="701,0,0,0" BorderThickness="0" Click="closeButton_Click" Command="{Binding MainCloseButtonCommand}" CommandParameter="{Binding ElementName = mainWindow}" Height="45" Width="45" >
            <StackPanel Height="45" Width="45">
                <Image x:Name="closeButtonImage" Margin="0" Source="/ProjectName;component/Resources/x.fw.png" Height="33"/>
                <TextBlock Text="Close" Width="36" Padding="6,0,0,0" HorizontalAlignment="Center" Height="13" FontSize="10"/>
            </StackPanel>
        </Button>

在事件处理程序中无法识别Close,因为当前类中可能没有名为Close的方法。如果要调用主窗口的关闭方法,可以使用:

private void closeButton_Click(object sender, RoutedEventArgs e)
{
 Application.Current.MainWindow.Close();    
}

上面提到的不是一个很好的方法,也不符合MVVM模式。这与你的第二个问题有关。如果看不到代码的剩余部分,很难说命令绑定为什么不起作用。我猜你没有把命令接好让它开火。您需要确保已经创建了RelayCommand实例,并且正确设置了命令属性。

Close在事件处理程序中无法识别,因为当前类中可能没有名为Close的方法。如果要调用主窗口的关闭方法,可以使用:

private void closeButton_Click(object sender, RoutedEventArgs e)
{
 Application.Current.MainWindow.Close();    
}

上面提到的不是一个很好的方法,也不符合MVVM模式。这与你的第二个问题有关。如果看不到代码的剩余部分,很难说命令绑定为什么不起作用。我猜你没有把命令接好让它开火。您需要确保创建了RelayCommand实例,并且正确设置了命令属性。

如果您仅在视图和代码隐藏中工作,则可能没有准确地遵循MVVM模式<代码>中继命令
,在大多数情况下,用于代替单击事件。如果您仅在视图和代码隐藏中工作,则可能没有准确地遵循MVVM模式<代码>中继命令
,在大多数情况下,是用来代替点击事件的。我不同意与MVVM对齐的部分。我的观点是,如果逻辑只与视图相关,那么将其包含在代码中就可以了。因此,假设在启动关闭操作时不需要保存逻辑或返回逻辑(业务逻辑),那么将关闭逻辑放在代码中仍然可以遵守关注点分离。我不同意与MVVM对齐的部分。我的观点是,如果逻辑只与视图相关,那么将其包含在代码中就可以了。因此,假设在启动关闭操作时不需要保存逻辑或返回逻辑(业务逻辑),那么通过将关闭逻辑放在代码中,仍然可以遵守关注点分离。