首页 > 其他分享 >WPF MVVM capture window keyboard

WPF MVVM capture window keyboard

时间:2024-07-06 18:21:15浏览次数:1  
标签:capture Windows System value window IsPaused using WPF public

 //xaml
    <behavior:Interaction.Triggers>
        <behavior:EventTrigger EventName="KeyDown">
            <behavior:CallMethodAction TargetObject="{Binding}" MethodName="Window_KeyDown"/>
        </behavior:EventTrigger>
    </behavior:Interaction.Triggers>


//cs
public void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
    {
        IsPaused = !IsPaused;
    }
}

 

 

 Whole code

//xaml
<Window x:Class="WpfApp197.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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:behavior="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:local="clr-namespace:WpfApp197"  
        mc:Ignorable="d" WindowState="Maximized"
        Title="{Binding MainTitle,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Height="450" Width="800">
    <behavior:Interaction.Triggers>
        <behavior:EventTrigger EventName="KeyDown">
            <behavior:CallMethodAction TargetObject="{Binding}" MethodName="Window_KeyDown"/>
        </behavior:EventTrigger>
    </behavior:Interaction.Triggers>
    <Grid Background="Transparent"> 
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox x:Name="lbx" Grid.Column="0" 
                 ItemsSource="{Binding BooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                 SelectedItem="{Binding SelectedBook,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                 SelectedIndex="{Binding SelectedIdx,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Image Source="{Binding ImgUrl}" Width="200" Height="500"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Image Grid.Column="1" ClipToBounds="True"
               Source="{Binding SelectedItem.ImgUrl,ElementName=lbx}"/>
    </Grid>
</Window>


//cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;

namespace WpfApp197
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var vm = new BookVM();
            this.DataContext = vm;
        }

    }

    public class BookVM : INotifyPropertyChanged
    {
        public BookVM()
        {
            InitData();
            TimerChangedImgPeriodically();
        }

        private void TimerChangedImgPeriodically()
        {
            System.Timers.Timer tm = new System.Timers.Timer();
            tm.Interval = 200;
            tm.Elapsed += Tm_Elapsed;
            tm.Start();
        }

        private void Tm_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!IsPaused)
            {
                if (++SelectedIdx >= BooksList.Count)
                {
                    SelectedIdx = 0;
                }
            }
        }

        private void InitData()
        {
            BooksList = new List<Book>();
            var imgsList = Directory.GetFiles(@"..\..\Images", "*.*");
            int len = imgsList.Length;

            if (imgsList != null && imgsList.Any())
            {
                for (int i = 0; i < len; i++)
                {
                    BooksList.Add(new Book()
                    {
                        Id = i + 1,
                        ImgUrl = imgsList[i % len]
                    });
                }
                SelectedBook = BooksList[0];
            }
        }

        public void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Space)
            {
                IsPaused = !IsPaused;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler?.Invoke(this, new PropertyChangedEventArgs(propName));
            }
        }

        private List<Book> booksList;
        public List<Book> BooksList
        {
            get
            {
                return booksList;
            }
            set
            {
                if (value != null)
                {
                    booksList = value;
                    OnPropertyChanged(nameof(BooksList));
                }
            }
        }

        private Book selectedBook;
        public Book SelectedBook
        {
            get
            {
                return selectedBook;
            }
            set
            {
                if (value != selectedBook)
                {
                    selectedBook = value;
                    OnPropertyChanged(nameof(SelectedBook));
                    MainTitle = SelectedBook.ImgUrl;
                }
            }
        }

        private string mainTitle;
        public string MainTitle
        {
            get
            {
                return mainTitle;
            }
            set
            {
                if (value != mainTitle)
                {
                    mainTitle = value;
                    OnPropertyChanged(nameof(MainTitle));
                }
            }
        }

        private int selectedIdx;
        public int SelectedIdx
        {
            get
            {
                return selectedIdx;
            }
            set
            {
                if (value != selectedIdx)
                {
                    selectedIdx = value;
                    OnPropertyChanged(nameof(SelectedIdx));
                }
            }
        }

        private bool isPaused;
        public bool IsPaused
        {
            get
            {
                return isPaused;
            }
            set
            {
                if (value != isPaused)
                {
                    isPaused = value;
                    OnPropertyChanged(nameof(IsPaused));
                    if(IsPaused) 
                    {
                        MainTitle = $"{SelectedBook.ImgUrl} is Paused!";
                    }
                }
            }
        }
    }

    public class Book
    {
        public int Id { get; set; }
        public string ImgUrl { get; set; }
    }
}

 

标签:capture,Windows,System,value,window,IsPaused,using,WPF,public
From: https://www.cnblogs.com/Fred1987/p/18287565

相关文章

  • 关于Windows防火墙的漏洞,具体信息可能随着时间和操作系统版本的更新而变化。以下是一
    Windows防火墙,特别是WindowsDefender防火墙,是Windows操作系统中用于保护计算机免受网络攻击的关键组件。然而,像任何其他安全系统一样,Windows防火墙也可能存在漏洞或安全问题。以下是一些可能涉及Windows防火墙的具体漏洞或安全问题的讨论:1.默认配置和设置不当默认设置不安全:W......
  • 编写 PowerShell 脚本来管理 Windows 防火墙可以帮助自动化配置和监控网络安全设置。
    编写PowerShell脚本来管理Windows防火墙可以帮助自动化配置和监控网络安全设置。以下是一个简单的大纲,涵盖了管理Windows防火墙的主要方面:1.导入模块和设置变量导入 NetSecurity 模块以访问防火墙cmdlet。设置需要使用的变量,如规则名称、端口号等。2.查询和列出......
  • MinGW GCC Windows下编译libmodbus
    最近项目从MSVC切换到GCC,libmodbus官网没提供MinGW下GCC如何编译,官网推荐在类UNIX环境下MSYS下编译,个人更偏向直接拿源文件编译。编译libmodbus版本:libmodbus-3.1.10GCC编译器版本: 5.3.0(i686-posix-dwarf-rev0,BuiltbyMinGW-W64project)CMake版本: 3.29.0在随笔最......
  • 在 Windows 中,你可以通过修改注册表来调整系统对于同时打开 SYN 半连接数目的限制。这
    在Windows中,你可以通过修改注册表来调整系统对于同时打开SYN半连接数目的限制。这个限制通常被用来防范SYN攻击,但有时候需要根据特定的网络环境和需求进行调整。以下是在注册表中修改SYN半连接数目限制的步骤:打开注册表编辑器:按下Win+R组合键打开运行窗口。......
  • 在 Windows 操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tc
    在Windows操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的两个重要参数控制着TCP/IP协议栈的行为。这些参数可以通过注册表来配置,影响网络连接和端口资源的管理。1.MaxUserPort路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe......
  • windows下,用PowerShell安装fnm,并安装Node.js步骤
    1#installsfnm(FastNodeManager)/安装fnm2wingetinstallSchniz.fnm3#重新开启powershell4#!不确定是否需要此步骤!5$profile6#!不确定是否需要此步骤!按照上面的输出,创建缺失的文件夹7#创建$profile文件:粘贴到powershell后,按回车8if(!(Test-P......
  • 将jar可执行文件打包为windows安装包体
    当我们希望将java编写的可执行文件.jar打包为一个.exe供用户直接使用,我们需要将jre/jdk也打包到exe中,这样用户环境就不需要安装jdk,直接运行我们做好的exe文件。整个过程分为两步,为了方便演示,这里使用JMonkeyEngineSDK打包一个jme3游戏的方式来解释。工具首先下载这里的工具:链......
  • FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。其中SRT全称为SecureReliableTransport,中文叫做安全可靠传输协议。RIST全称为Reliable......
  • 2.7 在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)——《跟老吕学P
    2.7在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)——《跟老吕学Python》在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)一、PyCharm系统要求二、下载PyCharm1.访问PyCharm官网2.转入PyCharm主页3.选择版本4.转入版本下载页面......
  • Windows传统DOS路径有效性检测(资源篇)
    需求    本篇旨在探索Windows传统DOS路径有效性检测的一种可行方案,实际上许多Windows文件IO相关的API也同样可以作为一种方案,为了锻炼一下我们的思考和解决问题的能力,所以我们需要另辟蹊径。本篇将通过有限自动机来验证路径有效性,仅记录资源,具体的实现原理将在后续篇......