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方法,关闭该窗口。

相关推荐
笺上知微9 小时前
基于HelixToolkit.SharpDX 渲染3D模型
wpf
晓纪同学2 天前
WPF-03 第一个WPF程序
大数据·hadoop·wpf
光电大美美-见合八方中国芯2 天前
用于无色波分复用光网络的 10.7 Gb/s 反射式电吸收调制器与半导体光放大器单片集成
网络·后端·ai·云计算·wpf·信息与通信·模块测试
晓纪同学2 天前
WPF-02体系结构
wpf
晓纪同学2 天前
WPF-01概述
wpf
海盗12342 天前
OxyPlot 在 WPF 中的使用
.net·wpf
晓纪同学2 天前
WPF-04 XAML概述
wpf
△曉風殘月〆3 天前
如何在WPF中捕获窗口外的事件
wpf
爱吃烤鸡翅的酸菜鱼4 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
武藤一雄5 天前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf