WPF中如何在MVVM模式下关闭窗口

完全来源于十月的寒流,感谢大佬讲解

使用Behaviors

csharp 复制代码
<Window x:Class="Test_03.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_03"
        WindowStyle="None"
        mc:Ignorable="d"
        Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>
    <Grid>
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="50" Text="{Binding Title}"></TextBlock>
        <StackPanel Margin="5.0" HorizontalAlignment="Right" VerticalAlignment="Top"
                    Orientation="Horizontal">
            <StackPanel.Resources></StackPanel.Resources>
            <Button Margin="5.0" Content="_">
                <b:Interaction.Triggers>
                    <b:EventTrigger EventName="Click">
                        <b:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Window}}" PropertyName="WindowState" Value="{x:Static WindowState.Minimized}"></b:ChangePropertyAction>
                    </b:EventTrigger>
                </b:Interaction.Triggers>
            </Button>
            <Button Margin="5.0" Content="[ ]">
                <b:Interaction.Triggers>
                    <b:EventTrigger EventName="Click">
                        <b:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Window}}" PropertyName="WindowState" Value="{x:Static WindowState.Maximized}"></b:ChangePropertyAction>
                    </b:EventTrigger>
                </b:Interaction.Triggers>
            </Button>
            <Button Margin="5.0" Content="X" Background="Red">
                <b:Interaction.Triggers>
                    <b:EventTrigger EventName="Click">
                        <b:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Window}}" MethodName="Close"></b:CallMethodAction>
                    </b:EventTrigger>
                </b:Interaction.Triggers>
            </Button>
        </StackPanel>
    </Grid>
</Window>

讲解

  1. <b:Interaction.Triggers>: 是一个开始定义触发器的标记。通常,这个标记包含在一个控件的开始标记和结束标记之间,用于指定将要应用触发器的控件。

  2. <b:EventTrigger EventName="Click">: 表示一个事件触发器,告诉XAML在指定的事件发生时执行后续定义的动作。在这里,事件名称为"Click",表示当用户点击与此触发器相关联的UI元素时触发。

  3. <b:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Window}}" MethodName="Close"></b:CallMethodAction>: 这是触发器的动作部分。使用了CallMethodAction,这是一种行为,用于调用方法。指定了要调用的方法是窗口(Window)的Close方法。

    • TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Window}}": 这部分指定了目标对象,即将要调用方法的对象。在这里,通过使用RelativeSource,找到了最近的窗口(Window)并将其绑定为目标对象。

    • MethodName="Close": 这部分指定了要调用的方法的名称,即窗口的Close方法。

因此,整个代码的作用是,当与此触发器相关联的UI元素(可能是一个按钮)被点击时,会调用最近的窗口的Close方法,关闭该窗口。

相关推荐
拾忆,想起10 小时前
Redisson 分布式锁的实现原理
java·开发语言·分布式·后端·性能优化·wpf
weixin_4640780712 小时前
wpf依赖注入驱动的 MVVM实现(含免费源代码demo)
wpf
beyond谚语16 小时前
一、WPF入门介绍+Grid和StackPanel布局介绍+实战模拟Notepad++页面布局
wpf
CPU不够了16 小时前
WPF常见问题清单
wpf·自适应
beyond谚语17 小时前
二、WPF——Style样式玩法(通过资源字典将Style独立,全局调用)
wpf
光辉岁月~1 天前
使用CalcBinding实现复杂逻辑绑定
wpf
SunflowerCoder1 天前
WPF迁移avalonia之触发器
c#·wpf·avalonia
主宰者1 天前
【WPF+Prism】日常开发问题总结
wpf
~空中楼阁2 天前
WPF WriteableBitmap 高性能双缓冲图片显示方案
wpf
I'mSQL2 天前
WPF资源字典合并报错
wpf