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

news2024/9/23 13:20:45

早些年在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 : ViewModelBase
 2 {
 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.coloradmin.cn/o/2099868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp基础知识点补充

一. 响应式单位rpx和绝对单位px 1.px的作用及理解 绝对单位&#xff1a;px 是一个绝对单位&#xff0c;表示屏幕上的实际像素数量,不随屏幕尺寸或分辨率变化而变化。广泛适用&#xff1a;在Web开发中广泛使用&#xff0c;适用于各种浏览器和设备,适用于CSS中的各种属性&#xf…

线性代数 第四讲 极大线性无关组,等价向量组,向量组的秩

文章目录 1.极大线性无关组2.等价向量组2.1 等价向量组的判断 3.向量组的秩4.等价矩阵和等价向量组5. 重难点题型总结5.1 极大线性无关组的计算5.2 AB的行向量表示与AB的列向量表示 1.极大线性无关组 定义: 在一个向量组中&#xff0c;取部分向量组成新的向量组&#xff0c;这…

零基础5分钟上手亚马逊云科技-开发云原生网站应用

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

交换机自动化获取诊断(H3C_无人值守)

介绍 在网络遇到个人无法处理的问题时&#xff0c;需要下载诊断信息发送给400处理&#xff0c;而通过传统的方式获取诊断信息需要通过多个步骤来获取&#xff0c;步骤繁琐&#xff0c;在设备数量过多的情况下&#xff0c;严重影响工作效率&#xff0c;而通过python自动化的方式…

情感分析——中文金融情感词典

情感分析——中文金融情感词典 [1]姜富伟,孟令超,唐国豪.媒体文本情绪与股票回报预测[J].经济学(季刊),2021,21(04):1323-1344.DOI:10.13821/j.cnki.ceq.2021.04.10. 该文章在Loughranand MacDonald(2011)词典的基础上通过人工筛选和Word2vec算法扩充&#xff0c;构建了一个更新…

数据结构——初始数据结构!!!

本章将简单介绍数据结构&#xff0c;欢迎大家点赞➕收藏&#xff0c;蟹蟹&#xff01;&#xff01;&#xff01;&#x1f495; &#x1f308;个人主页&#xff1a;404_NOT_FOUND ​1.简介 是一门基础学科研究的是数据如何在计算机中进行组织和存储&#xff0c;使得我们可以高效…

安捷伦Agilent E8362B,E8362C 20G/PNA高性能网络分析仪

安捷伦Agilent E8362B、E8362C PNA 网络分析仪&#xff0c;10 MHz - 20 GHz ​Agilent E8362B PNA&#xff08;高性能网络分析仪&#xff09;为您提供出色的性能、先进的自动化功能、灵活的连接性&#xff0c;并且易于使用。设计师和工程师喜欢 Agilent E8362B&#xff0c;因为…

深入探讨元学习(Meta-Learning):从“学习如何学习”到机器智能的飞跃

深入探讨元学习&#xff08;Meta-Learning&#xff09;&#xff1a;从“学习如何学习”到机器智能的飞跃 随着人工智能技术的飞速发展&#xff0c;传统机器学习模型在面对新任务时的局限性日益凸显。据研究&#xff0c;平均而言&#xff0c;一个深度学习模型在全新任务上达到可…

IPC机制(三)--共享内存和信号灯

目录 前言 一、什么是共享内存 二、创建一个共享内存 三、信号灯/信号集 1、临界资源 2、同步互斥机制 1、互斥机制&#xff1a; 2、同步&#xff1a; 3、信号灯的机制 4、信号灯的函数 四、信号灯控制进程对共享内存的访问 进程1&#xff1a; 进程2&#xff1a; …

通过G2++利率模型来模拟短期和长期利率的随机路径

G2利率模型是一种用于描述和预测利率变化的数学模型&#xff0c;它属于随机利率模型的一种。随机利率模型主要用于研究一段时间内利率的随机波动。 G2模型的核心在于它能够通过两个因子来捕捉短期和长期利率的动态变化。这两个因子通常与宏观经济变量相关联&#xff0c;能够更…

网络安全宗旨和目标

网络安全涉及网络和相关数据及信息的保护与保障。它已从物理技术发展到防病毒和反网络钓鱼平台等软件方法。 在本章中&#xff0c;我们将详细讨论网络安全的主要目标和原则&#xff0c;并提供与之相关的具体示例。所以&#xff0c;让我们从网络安全的目标开始。 网络安全的目的…

二手Agilent N6705B+N6781A电源模块N6705C

二手Agilent N6705BN6781A电源模块N6705C 产品概述 AgilentN6705B是可集成多达4个具有数字万用表、示波器、任意波形发生器和数据记录器特性的xj电源&#xff0c;可显著提高产生和测量输送到被测件中的直流电压和电流的效率。可使您无需开发和调试程序来控制大量仪器&#xf…

BaseCTF高校联合新生赛Week1复现(Web)

目录 A Dark Room Aura 酱的礼物 HTTP 是什么呀 md5绕过欸 喵喵喵•&#xfecc;• A Dark Room 打开环境 先查看源码&#xff0c;拉到最后看到flag Aura 酱的礼物 第一层看见file_get_contents()函数&#xff0c;想到文件包含&#xff0c;可以用伪协议&#xff0c;一般是…

Spring框架的案例程序

Spring框架的案例程序通常涉及构建一个简单的应用程序&#xff0c;以展示Spring的核心功能&#xff0c;如依赖注入、面向切面编程、数据访问等。以下是一个基本的Spring案例程序&#xff0c;它包括一个Spring Boot应用程序&#xff0c;用于展示如何使用Spring构建RESTful服务。…

Elasticsearch 基于Windows环境安装

1、 Java 下载安装 1.1 下载地址 elasticsearch 8.x 版本需要jdk17及以上版本支持 JDK下载地址 2、下载和安装 ES 2.1 下载地址 Past Release 2.2 文件目录 3、启动服务 3.1 启动方式 Windows&#xff1a;双击 bin 目录下的 elasticsearch.bat 文件Mac&#xff1a;双击…

深度学习系列74:语音中的mel谱

1 mel谱介绍 一个人说一句话&#xff0c;其 waveform 可以很不一样&#xff0c;但是 spectrogram 基本上会相似&#xff0c;甚至有人可以通过 spectrogram 来判断说话的内容。语谱图的横坐标是时间&#xff0c;纵坐标是频率&#xff0c;坐标点值为语音数据能量。由于是采用二维…

计算机网络(一) —— 网络基础入门

目录 一&#xff0c;关于网络 二&#xff0c;协议 2.1 协议是什么&#xff0c;有什么用&#xff1f; 2.2 协议标准谁定的&#xff1f; 2.3 协议分层 2.4 OSI 七层模型 2.5 TCP/IP 四层模型 三&#xff0c;网络传输基本流程 3.1 局域网中两台主机通信* 3.2 报文的封装与…

智能化浪潮赋能工业制造与报废拆解,基于高精度YOLOv8全系列参数【n/s/m/l/x】模型开发构建工业生产场景下车辆不同部位智能化分割检测识别分系统

随着科技的飞速发展&#xff0c;数字化与智能化已成为推动社会进步的强大引擎。在工业生产制造与汽车报废处理这一传统领域中&#xff0c;这一变革尤为显著。曾经&#xff0c;流水线作业与人工拆解是这些行业的主要生产方式&#xff0c;它们不仅效率低下&#xff0c;且高度依赖…

如何从 AWS CodeCommit 迁移到极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 本文将分享如何从 AWS CodeCommit 服务无缝迁…

【无标题】XSS安全防护:responseBody (输入流可重复读) 配置

接上文:配置XSS过滤器 XXS 安全防护:拦截器+注解实现校验-CSDN博客XSS(跨站脚本)攻击是一种网络安全威胁,允许攻击者注入恶意脚本到看似安全的网站。当用户浏览这些被注入恶意代码的网页时,恶意脚本会在用户的浏览器环境中执行,这可能导致多种安全问题,如窃取敏感数据、…