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

相关推荐
FuckPatience11 小时前
WPF 窗体唤醒,判断是否已存在,存在则弹出
wpf
程序员清风13 小时前
从单体应用到微服务:后端系统拆分的基本方法
微服务·架构·wpf
FuckPatience2 天前
WPF 改变根据某一列条件改变行样式
wpf
dalong102 天前
WPF:DataGrid样式
wpf
samble4 天前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
姜穆澜4 天前
OneID 从 0 到 1 完整生产案例(三)
大数据·wpf
dalong104 天前
WPF:MVVM 示例
大数据·wpf
samble4 天前
从零搭建工业控制系统(二十一):状态管理系统——中心状态对象设计
c#·wpf·mvvm·状态管理·工业控制
mengge.cloud5 天前
存储技术基础小白教程
linux·运维·服务器·wpf·存储
DreamLife☼5 天前
复杂Agent系统架构设计
系统架构·wpf·agent·组件·设计·构架·说明