WPF MVVM如何在ViewModel直接操作控件对象

news/2024/9/17 3:08:47/ 标签: wpf, mvvm

早些年在WPF中使用COM组件时,需要在ViewModel中操作COM组件中的控件对象,但是这个控件对象又不支持绑定,

后面的解决办法是在窗口加载时,将控件对象以参数传递到Loaded事件的处理命令中,然后将这个对象记录下来,后面就可以直接操作这个控件了。

今天同事在使用WebView2的时候,又遇到这个问题,写个文章分享一下,给后续需要的小伙伴提供点参考。

我们创建一个WPF的项目,然后在界面上放置一个WMP控件(Windows Media Player)。

MainWindow.xaml

 1 <Window x:Class="GetControlInViewModel.MainWindow"2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"6         xmlns:wmp="clr-namespace:AxWMPLib;assembly=AxInterop.WMPLib"7         xmlns:local="clr-namespace:GetControlInViewModel"8         mc:Ignorable="d"9         Title="MainWindow" Height="450" Width="800">
10     <Grid>
11         <WindowsFormsHost>
12             <wmp:AxWindowsMediaPlayer x:Name="WMPPlayer"></wmp:AxWindowsMediaPlayer>
13         </WindowsFormsHost>
14     </Grid>
15 </Window>

如果我们想在ViewModel中操作这个WMP对象,可以在Loaded事件中添加如下处理

这里我使用了废弃的包MvvmLight来做演示,因为比较简单方便。

1  <i:Interaction.Triggers>
2      <i:EventTrigger EventName="Loaded">
3          <i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=WMPPlayer}"></i:InvokeCommandAction>
4      </i:EventTrigger>
5  </i:Interaction.Triggers>

ViewModel

 1 public class MainViewModel : ViewModelBase2 {3     private AxWMPLib.AxWindowsMediaPlayer mediaPlayer;4 5     public RelayCommand<AxWMPLib.AxWindowsMediaPlayer> OnLoadedCommand { get; private set; }6     7     public MainViewModel()8     {9         OnLoadedCommand = new RelayCommand<AxWMPLib.AxWindowsMediaPlayer>(OnLoaded);
10     }
11 
12     private void OnLoaded(AxWMPLib.AxWindowsMediaPlayer axWindowsMediaPlayer)
13     {
14         this.mediaPlayer = axWindowsMediaPlayer;
15     }
16 }

然后将ViewModel绑定到MainWindow上,运行时就可以获取到WMP对象

有时我们会遇到控件未初始化,在Loaded事件中无法获取到控件对象,类似下面这样

比如在使用Prism进行区域导航的时候,就可能会出现这个问题。

此时我们可以将整个窗口/用户控件(UserControl)传过来,然后延时一秒,或者延时加循环几次,就可以获取到控件对象

1  private async void OnLoaded(Window window)
2  {
3      await Task.Delay(1000);
4      var webViewElement = window.FindName("WebView");
5      if (webViewElement != null)
6          this.webView = webViewElement as WebView2;
7  }

示例代码


http://www.ppmy.cn/news/1522005.html

相关文章

51单片机-第十二节-LCD1602液晶显示屏

一、LCD1602介绍&#xff1a; LCD1602是一种字符型液晶显示屏&#xff0c;可以显示ASCII码的标准字符和其他的内置特殊字符。 显示容量&#xff1a;16*2个字符&#xff0c;每个字符为5*7点阵。 二、引脚及应用电路&#xff1a; 其中&#xff1a;D0-7这8位数据是接在P0引脚上…

vim 快捷命令

在 Vim 中&#xff0c;进入末行模式的方法如下&#xff1a; 1. 按下 Esc 键&#xff0c;进入命令模式。 2. 输入 :&#xff0c;进入末行模式。 在末行模式下&#xff0c;你可以输入 Vim 命令&#xff0c;例如 q 强制退出 Vim&#xff0c;w 保存文件&#xff0c;r 读取文件等。…

数字人模型像素流送实时渲染网页手机平板用语音交互

随着AI的出圈&#xff0c;数字人结合大语言模型也迎来了春天&#xff0c;市场上涌现了越来越多的数字人服务&#xff0c;深耕于不同的实际使用场景。点量小芹在和一些数字人厂家交流的过程中发现&#xff0c;很多厂家对于数字人如何更好地在网页、手机平板等移动端使用&#xf…

Java中优先队列API

Java中的优先队列&#xff08;PriorityQueue&#xff09;是一个基于堆实现的无界队列&#xff0c;优先队列中的元素按照自然顺序或者通过提供的比较器排序。 1. 构造方法 PriorityQueue(): 创建一个默认初始容量为11的空优先队列&#xff0c;并根据其元素的自然顺序对其进行排…

HTML 列表

列表是网页中最常用的一种数据排列方式 在HTML中&#xff0c;列表共分为三种&#xff1a;有序列表、无序列表和定义列表。在有序列表中&#xff0c;列表项之间有先后顺序之分。在无序列表中&#xff0c;列表项之间是没有先后顺序之分的。而定义列表是一组带有特殊含义的列表&a…

PMP--谋定而后动

文章目录 技巧一模二模三模9.资源管理--问题解决--谋定而后动14.敏捷–人员–教练/项目经理–仆人式领导–职责–核心工作–消除障碍&#xff1b;–作用–促进合作&#xff08;题干关键词 “促进合作、清除障碍、指导团队”。&#xff09;&#xff1a;148、 [单选] 在评估当前冲…

Apache Tomcat 6.0.45 下载、安装和配置教程

文章目录 序言下载安装配置 序言 安装前配置好jdk环境。 下载 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZWyKoNe0K7S748BntE48mw 提取码&#xff1a;6666 安装 1&#xff0c;双击图标&#xff0c;启动程序 2&#xff0c;单击“Next”按钮 3&…

集成电路学习:什么是RTC实时时钟

一、RTC&#xff1a;实时时钟 RTC&#xff0c;即实时时钟&#xff08;Real-Time Clock&#xff09;&#xff0c;是一种能够在设备中持续运行并准确记录时间的电子组件。它广泛应用于计算机、手机、嵌入式系统、智能家居设备等多种场合&#xff0c;为这些设备提供精确的时间基准…

个股场外期权的行权时间是什么时候?

今天带你了解个股场外期权的行权时间是什么时候&#xff1f;场外个股期权的行权日并没有一个固定的日期&#xff0c;它主要取决于期权合约的具体条款和规定。 个股场外期权 个股场外期权是指在场外交易市场进行的、以单个股票为标的资产的期权合约。这种期权与在交易所交易的…

2024数学建模国赛高教社杯C题:农作物的种植策略 思路代码文章助攻手把手保姆级

发布于18:25有问题后续会修正!! 背景信息 问题分析基于你提供的资料——2024年全国大学生数学建模竞赛C题&#xff0c;其核心内容为优化一个乡村的农作物种植策略。 背景分析 该乡村位于华北山区&#xff0c;气候较冷&#xff0c;土地资源有限&#xff0c;存在四种地块类型&a…

LeetCode560. 和为 K 的子数组(2024秋季每日一题 12)

给你一个整数数组 n u m s nums nums 和一个整数 k k k &#xff0c;请你统计并返回 该数组中和为 k k k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&…

110001安庆巡检_工艺巡检

安庆巡检_工艺巡检 一. 工艺配置二. 点检计划三. 点检任务四. 复检任务1. 复检列表1.1 页面展示 2. 复检任务下发2.1 操作说明2.2 业务说明2.3 表关联说明ps_recheck_task工艺工序参数_复检详情表 3. 复检详情2.1 获取参数点检详情2.2 获取复检详情列表 4. app端复检任务提交4.…

FastAPI 中间件与依赖注入:打造灵活的 API 架构

在 FastAPI 中&#xff0c;Depends 是一个非常重要的概念&#xff0c;它用于依赖注入。依赖注入是一种设计模式&#xff0c;允许你将组件&#xff08;如函数、类或服务&#xff09;之间的依赖关系明确地表达出来&#xff0c;而不是硬编码在组件内部。这使得代码更加模块化、可测…

SpringCloud集成ELK

1、添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version> </dependency>2、在logback-spring.xml中添加配置信息&#xff08;logback-sp…

SpringMVC使用:类型转换数据格式化数据验证

01-类型转换器 先在pom.xml里面导入依赖&#xff0c;一个是mvc框架的依赖&#xff0c;一个是junit依赖 然后在web.xml里面导入以下配置&#xff08;配置的详细说明和用法我在前面文章中有写到&#xff09; 创建此测试类的方法用于测试springmvc是具备自动类型转换功能的 user属…

数学建模_缺失值处理_拉格朗日、牛顿插值(全)

- 缺失值处理 1. 识别缺失值 在处理缺失值之前&#xff0c;首先需要识别数据中的缺失值。 1.1 使用 isna() 和 isnull() Pandas 提供了 isna() 和 isnull() 方法来检测缺失值&#xff0c;二者功能相同。 import pandas as pddf pd.DataFrame({A: [1, 2, None, 4],B: [None, 2,…

数据仓库: 6- 数据仓库分层

目录 6- 数据仓库分层6.1 简介6.1.1 数据仓库分层的优势6.1.2 常见的数据仓库分层模型6.1.2.1 四层模型6.1.2.2 三层模型 6.1.3 数据仓库分层原则6.1.4 数据仓库分层示例6.1.5 总结 6.2 ODS&#xff08;操作数据存储&#xff09;层6.2.1 ODS 层的主要功能6.2.2 ODS 层的特点6.2…

PHP批量修改MySQL数据表字符集为utf8mb4/utf8mb4_unicode_ci

编码大全 可参考我之前的文章&#xff1a; 快速理解ASCII、GBK、Unicode、UTF-8、ANSI 批量修改 注意这是DDL操作&#xff0c;操作过程会锁表&#xff08;元数据锁&#xff09;&#xff0c;平均1秒能够转码3张表&#xff08;数据量不大&#xff09;。 亲测操作过后没有数据异…

内网隧道:端口转发

目录 LCX端口转发 场景一 场景二 SSH的端口转发 一、本地转发&#xff08;正向访问A&#xff09;&#xff1a; 二、远程转发&#xff08;反向访问A&#xff09; 三.NETSH端口转发 端口转发和端口映射 端口转发,有时被称为做隧道,是安全壳( SSH)为网络安全通信使用的一种方…

[物理专题]经典浮力题目的Fh图像绘制

这段代码用于绘制物体在液体中受到的浮力变化的图像&#xff0c;它有多个好处&#xff1a; 直观展示数据&#xff1a;通过图形化展示&#xff0c;可以直观地看到物体在液体中浸入深度与受到的浮力之间的关系。 教育和学习工具&#xff1a;这种类型的图像常用于教育目的&#x…