首页 > 其他分享 >wpf viewmodel中控制页面焦点

wpf viewmodel中控制页面焦点

时间:2023-09-22 11:15:35浏览次数:36  
标签:sender UIElement viewmodel IsFocusedProperty handler static bool wpf 页面

public static class FocusBehavior
    {
        private static Dictionary<UIElement, RoutedEventHandler> handlers = new Dictionary<UIElement, RoutedEventHandler>();
        public static bool? GetIsFocused(DependencyObject obj)
        {
            return (bool?)obj.GetValue(IsFocusedProperty);
        }
        public static void SetIsFocused(DependencyObject obj, bool? value)
        {
            obj.SetValue(IsFocusedProperty, value);
        }
        public static readonly DependencyProperty IsFocusedProperty =
                    DependencyProperty.RegisterAttached(
                    "IsFocused",
                    typeof(bool?),
                    typeof(FocusBehavior),
                    new UIPropertyMetadata()
                    {
                        DefaultValue = null,
                        PropertyChangedCallback =
                            (s, e) =>
                            {
                                UIElement sender = (UIElement)s;
                                RoutedEventHandler x;
                                if (!handlers.TryGetValue(sender, out x))
                                {
                                    Attach(sender);
                                }
                                if ((bool)e.NewValue)
                                {
                                    sender.Focus();
                                    Keyboard.Focus(sender);
                                }
                            }
                    });
        private static void Attach(UIElement sender)
        {
            RoutedEventHandler handler = (s, e) =>
            {
                UIElement ui = (UIElement)s;
                if (e.RoutedEvent == UIElement.GotFocusEvent)
                {
                    ui.SetValue(IsFocusedProperty, true);
                }
                if (e.RoutedEvent == UIElement.LostFocusEvent)
                {
                    ui.SetValue(IsFocusedProperty, false);
                }
            };
            sender.GotFocus += handler;
            sender.LostFocus += handler;
            handlers.Add(sender, handler);
        }
    }

注意引用名称空间

             xmlns:localHelper="clr-namespace:Test.Helper"

页面绑定此属性,注意需要双向绑定

<TextBox TabIndex="4" localHelper:FocusBehavior.IsFocused="{Binding ISFocusable5,Mode=TwoWay}"/>

[参考]
C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点

标签:sender,UIElement,viewmodel,IsFocusedProperty,handler,static,bool,wpf,页面
From: https://www.cnblogs.com/ives/p/17721832.html

相关文章

  • 项目开发难点-项目中两个窗口的页面,其中一个选择数据后回显到另一个项目页面中
    方法一:sessionStorage  如果项目是在浏览器中,打开或跳转另一个页面(可以使用同一个控制台)的情况下,可以用sessionStroage来存储数据,然后另一个页面获取数据 方法二:postMessage 适用情况与方法一一致(两个页面可以使用同一个控制台)。第二个页面选择后发送数据给第一个页面: w......
  • Docker上运行RabbitMQ,无法访问管理页面
    在CentOS7中的Docker安装并运行了RabbitMQ,但是在访问管理页面http://IP:15672/却提示拒绝访问这是因为在Docker上运行的RabbitMQ,默认情况下是没有启用管理插件和管理页面的使用命令dockerexec-it容器名/bin/bash进入RabbitMQ容器的命令行终端。容器名即CONTAINERID......
  • docker搭建青龙面板及页面空白解决方法
    最近也是想赚点小钱,搭建个青龙面包来挂脚本,但是在搭建过程中遇到过一些问题,所以记录下来。docker搭建青龙面板我这里是使用aliyun服务器进行搭建的,系统是centOS7.6版本。另外docker自行搜索安装即可。拉取青龙面板镜像远程登录服务器,输入命令拉取青龙镜像dockerpullwhyour......
  • WPF异步命令以及SqlSugar异步增删改查
    1、异步///<summary>///查询全部///</summary>///<returns></returns>publicasyncTask<List<IgniteTubeInfo>>QueryListAsync(){returnawaitdb.Queryable<IgniteTubeInfo>().ToListAsync();}///<summa......
  • 解决WPF+Avalonia在openKylin系统下默认字体问题
    一、openKylin简介openKylin(开放麒麟)社区是在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区,致力于通过开源、开放的社区合作,构建桌面操作系统开源社区,推动Linux开源技术及其软硬件生态繁荣发......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控
    在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随......
  • 【WPF】PasswordBox汇总
    一、回车事件写法1:绑定:TextPassWord.KeyDown+=TextPassWord_KeyDown;privatevoidTextPassWord_KeyDown(objectsender,KeyEventArgse){if(e.Key==Key.Enter){TextErr.Text=null;......
  • selenium自动化测试-获取动态页面小说
    有的网站页面是动态加载的资源,使用bs4库只能获取静态页面内容,无法获取动态页面内容,通过selenium自动化测试工具可以获取动态页面内容。参考之前的"bs4库爬取小说工具"文章代码,稍微修改下,就可以转成获取动态页面小说工具。第一步:先确定目标网址先找到小说目录页面。网址首页:'ht......
  • docker容器中打开gazebo等可视化页面报错No protocol specified
    转载:https://blog.csdn.net/wsl_longwudi/article/details/127005162权限问题Noprotocolspecified问题这是由于X11服务默认只允许『来自本地的用户』启动的图形程序将图形显示在当前屏幕上。解决的办法很简单,允许所有用户访问X11服务即可。这个事情可以用xhost命令完成在宿主......
  • wpf 覆盖元素在webview2之上
    元素代码来源githubCrissCross项目需要两个工具类及一个webview2的封装类//Copyright(c)ChrisPulman.Allrightsreserved.//LicensedundertheMITlicense.SeeLICENSEfileintheprojectrootforfulllicenseinformation.usingSystem;usingSystem.Runt......