当前位置: 首页 > news >正文

在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试

在 WPF 开发时,有 Snoop 的帮助,UI 的调试将变得非常轻松。使用 Snoop,能轻松地查看 WPF 中控件的可视化树以及每一个 Visual 节点的各种属性,或者查看数据上下文,或者监听查看事件的引发。

不过,更强大的是支持使用 PowerShell 脚本。这使得它即便 UI 没有给你提供一些入口,你也能通过各种方式查看或者修改 UI。


本文内容

      • Snoop PowerShell 入口
      • 自带的 PowerShell 变量
      • 基本的 PowerShell 命令
        • 属性
        • 创建对象
        • 调用方法
        • 参考资料

Snoop PowerShell 入口

常规 Snoop 的使用方法,将狮子瞄准镜拖出来对准要调试 UI 的 WPF 窗口松开。这里我拿 Visual Studio 2019 的窗口做试验。

调试 Visual Studio 2019 的 UI

在打开的新的 Snoop 窗口中我们打开 PowerShell 标签。

打开 PowerShell 标签

本文的内容将从这里开始。

自带的 PowerShell 变量

在 Snoop 的 PowerShell 提示窗口中,我们可以得知有两个变量可以使用:$root$selected。包含这两个,还有其他的可以使用:

  • $root 拿到当前 Snoop 窗口顶层元素类型的实例
  • $selected 拿到当前 Snoop 用鼠标或键盘选中的元素的实例
  • $parent 拿到当前 Snoop 选中元素的可视化树父级
  • $null 就是 .NET 中的 null

当然,你也可以定义和使用其他的变量,后面会说。

基本的 PowerShell 命令

属性

# 获取属性
$selected.Visual.Content
# 将属性设置为 null
$selected.Visual.Content = $null

直接像 C# 语法那样一直在后面使用 . 可以访问实例中的属性。不需要关心实例是什么类型的,只要拥有那个属性,就可以访问到。

比如下面,上面的例子我们选中的是 MainWindow,于是我们使用 $selected.Visual.Content 访问到 MainWindowContent 属性,而后面 $selected.Visual.Content = $null 则是将 Window 的内容清空了。

获取 Content 属性

设置 Content 属性

创建对象

# 创建对象
$button = New-Object System.Windows.Controls.Button -property @{ Content = "欢迎访问 walterlv.com" }

创建一个 Button

调用方法

$selected.Visual.Children.Add($button)

顶部的那个按钮就是通过上面的命令添加上去的。

调用实例方法

调用静态方法用的是 [类名]::方法名(参数)

$button.Content = [System.Environment]::Version.ToString() + " running for walterlv.com"

调用静态方法


参考资料

  • Snooping WPF: Tips and PowerShell tricks

我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • WPF 支持的多线程 UI 并不是线程安全的
  • ReSharper 在 C 盘占用了太多空间了,本文告诉你如何安全地删除或转移这些文件
  • WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
  • git 的合并原理(递归三路合并算法)
  • git 合并策略
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • 使用一句 git 命令将仓库的改动推送到所有的远端
  • 将 svn 仓库迁移到 git 仓库
  • 使用 Visual Studio 调试多进程的程序
  • 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)
  • 为 WPF 程序添加 Windows 跳转列表的支持
  • 在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular 响应式表单 基础例子
  • flask接收请求并推入栈
  • golang 发送GET和POST示例
  • Java应用性能调优
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • npx命令介绍
  • React-redux的原理以及使用
  • SpriteKit 技巧之添加背景图片
  • storm drpc实例
  • Vue官网教程学习过程中值得记录的一些事情
  • Windows Containers 大冒险: 容器网络
  • 我从编程教室毕业
  • 小程序开发之路(一)
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • # 飞书APP集成平台-数字化落地
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (SpringBoot)第二章:Spring创建和使用
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net(C#)中String.Format如何使用
  • .Net中的设计模式——Factory Method模式
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [.net]官方水晶报表的使用以演示下载
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [17]JAVAEE-HTTP协议
  • [BT]BUUCTF刷题第9天(3.27)
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape
  • [iOS]GCD(一)
  • [iOS]把16进制(#871f78)颜色转换UIColor
  • [MAC OS] 常用工具
  • [python-opencv] PNG 裁切物体
  • [SDOI2009]Elaxia的路线
  • [Silverlight]通过MVVM模式实现本地化/全球化(1)
  • [SQL调优] Maclean讲SQL调优精要
  • [导入]视频游戏开发系列课程(3):游戏元素大观园.zip(10.69 MB)