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

相关推荐
Macbethad1 小时前
工业设备数据记录程序技术方案
wpf·信息与通信
zzyzxb15 小时前
WPF 中隧道事件和冒泡事件
wpf
闲人编程15 小时前
API限流、鉴权与监控
分布式·python·wpf·限流·集群·令牌·codecapsule
TA远方16 小时前
【WPF】桌面程序使用谷歌浏览器内核CefSharp控件详解
wpf·浏览器·chromium·控件·cefsharp·cefsharp.wpf
Macbethad1 天前
工业设备数据采集主站程序技术方案
wpf
关关长语1 天前
HandyControl 3.5.x 版本 ListViewItem不显示问题
windows·wpf
Macbethad2 天前
工业设备维护程序技术方案
wpf
Macbethad2 天前
工业设备配方管理系统技术方案
wpf
喵叔哟2 天前
7.日志系统深入
wpf
清风徐来Groot2 天前
WPF布局之Grid
wpf