DevExpress开发WPF应用实现对话框总结

说明:

  • 完整代码Github​(https://github.com/VinciYan/DXMessageBoxDemos.git)
  • DevExpree v23.2.4(链接:https://pan.baidu.com/s/1eGWwCKAr8lJ_PBWZ_R6SkQ?pwd=9jwc 提取码:9jwc)
  • 使用Visual Studio Community 2022

在这里插入图片描述

简单标准弹窗

使用标准的.NET的MessageBox:

public void BaseMsg()
{MessageBox.Show("This is a standard .NET MessageBox", "Title", MessageBoxButton.OK, MessageBoxImage.Information);
}

在这里插入图片描述

DevExpress的DXMessageBox

public void DxBaseMsg()
{// 显示一个简单的消息框DXMessageBox.Show("This is a DevExpress DXMessageBox", "Title", MessageBoxButton.OK, MessageBoxImage.Information);
}

在这里插入图片描述

DevExpress的IMessageBoxService

在DevExpress WPF中使用IMessageBoxService来显示一个消息框,并根据用户的选择更新按钮的文本,符合MVVM模式的设计原则,保持了视图和视图模型的分离

<Window ...xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"DataContext="{dxmvvm:ViewModelSource Type=local:ViewModel}"><dxmvvm:Interaction.Behaviors><dx:DXMessageBoxService/></dxmvvm:Interaction.Behaviors><dx:SimpleButton Content="{Binding ButtonText}"Command="{Binding SaveConfirmationCommand}"/>
</Window>
public class ViewModel : ViewModelBase {public virtual string ButtonText { get; set; } = "Save Changes Button";IMessageBoxService MessageBoxService { get { return GetService<IMessageBoxService>(); } }[Command]public void SaveConfirmation() {MessageResult result;result = MessageBoxService.ShowMessage(messageBoxText: "Save Changes?",caption: "DXApplication",icon: MessageIcon.Question,button: MessageButton.YesNoCancel,defaultResult: MessageResult.Cancel);switch (result) {case MessageResult.Yes:ButtonText = "Changes Saved";break;case MessageResult.No:ButtonText = "Changes Discarded";break;case MessageResult.Cancel:ButtonText = "Continue Editing";break;}}
}

在这里插入图片描述

点击“Yes”按钮,修改按钮显示的文字为“Changes Saved”

在这里插入图片描述

DevExpress的DXDialog

DXDialog提供了比标准WPF对话框更强大的功能和更高的灵活性。它在定制、样式支持、MVVM集成、功能丰富性和一致的用户体验方面表现出色

DXDialog提供了丰富的功能,比如:

  • 定位:可以轻松控制对话框在屏幕上的位置
  • 大小:可以设置对话框的宽度和高度
  • 内容:可以将任意WPF控件添加到对话框中,支持复杂的内容布局

简单控件

public void BaseDXDialog()
{var dialog = new DXDialog{WindowStartupLocation = WindowStartupLocation.CenterScreen,Width = 500,Height = 300,Title = "Custom Dialog",Content = new TextBlock { Text = "This is a custom DXDialog", Margin = new Thickness(10) }};var result = dialog.ShowDialog();if (result == true){MessageBox.Show("OK clicked");}else{MessageBox.Show("Cancel clicked");}
}

在这里插入图片描述

复杂控件

public void CompDXDialog()
{// 创建一个 StackPanel 作为对话框的内容var stackPanel = new StackPanel{Margin = new Thickness(10)};// 在 StackPanel 中添加控件stackPanel.Children.Add(new TextBlock { Text = "Enter your name:", Margin = new Thickness(0, 0, 0, 10) });var nameTextBox = new TextBox { Width = 200, Margin = new Thickness(0, 0, 0, 10) };stackPanel.Children.Add(nameTextBox);stackPanel.Children.Add(new TextBlock { Text = "Select your age:", Margin = new Thickness(0, 0, 0, 10) });var ageComboBox = new ComboBox { Width = 200, Margin = new Thickness(0, 0, 0, 10) };ageComboBox.ItemsSource = new int[] { 18, 19, 20, 21, 22, 23, 24, 25 };stackPanel.Children.Add(ageComboBox);// 设置 StackPanel 作为对话框的内容var dialog = new DXDialog{WindowStartupLocation = WindowStartupLocation.CenterScreen,Title = "Custom Dialog with Controls",Content = stackPanel
};// 显示对话框并获取结果var result = dialog.ShowDialog();// 根据对话框结果进行处理if (result == true){string name = nameTextBox.Text;int? age = ageComboBox.SelectedItem as int?;MessageBox.Show($"Name: {name}, Age: {age}");}else{MessageBox.Show("Dialog was cancelled.");}
}

在这里插入图片描述

自定义控件

可以将一个View页面(例如一个用户控件)放置在DXDialog的Content属性中。这样可以使对话框的内容更加复杂和模块化,从而更好地组织和管理代码

以下是一个示例,展示如何在DXDialog中放置一个用户控件:

public void UserControlDXDialog()
{// 创建并设置用户控件作为对话框的内容var myUserControl = new MyUserControl();          var dialog = new DXDialog{WindowStartupLocation = WindowStartupLocation.CenterScreen,Title = "Custom Dialog with UserControl",Content = myUserControl};          // 显示对话框并获取结果var result = dialog.ShowDialog();// 根据对话框结果进行处理if (result == true){string name = myUserControl.UserName;int? age = myUserControl.UserAge;MessageBox.Show($"Name: {name}, Age: {age}");}else{MessageBox.Show("Dialog was cancelled.");}
}

在这里插入图片描述

DevExpress的IDialogService

自定义对话框按钮

SimpleDialogView.xaml

<UserControl x:Class="DXMessageBoxDemos.View.SimpleDialogView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"xmlns:local="clr-namespace:DXMessageBoxDemos.View"xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><dxmvvm:Interaction.Behaviors><dx:CurrentDialogService /></dxmvvm:Interaction.Behaviors><StackPanel><ComboBox SelectedItem="{Binding DialogResult}"><ComboBox.Items><dxmvvm:MessageResult>Yes</dxmvvm:MessageResult><dxmvvm:MessageResult>No</dxmvvm:MessageResult><dxmvvm:MessageResult>Cancel</dxmvvm:MessageResult></ComboBox.Items></ComboBox><Button Command="{Binding CloseCommand}" Content="Close the dialog from the dialog view model" /></StackPanel>
</UserControl>

SimpleDialogViewModel.cs

public class SimpleDialogViewModel : ViewModelBase
{public MessageResult DialogResult{get { return GetProperty(() => DialogResult); }set { SetProperty(() => DialogResult, value); }}protected ICurrentDialogService CurrentDialogService { get { return GetService<ICurrentDialogService>(); } }[Command]public void Close(){CurrentDialogService.Close(DialogResult);}
}

MainViewModel.cs

public MessageResult Result
{get { return GetProperty(() => Result); }set { SetProperty(() => Result, value); }
}
protected IDialogService DialogService { get { return GetService<IDialogService>(); } }[Command]
public void ShowDialog()
{Result = DialogService.ShowDialog(dialogButtons: MessageButton.YesNoCancel, title: "Simple Dialog", viewModel: new SimpleDialogViewModel());
}

MainView.xaml

<StackPanel><TextBlock Text="DialogService:"/><Button Command="{Binding ShowDialogCommand}" Content="Show Dialog" /><TextBlock Text="{Binding Result, StringFormat='The last result is {0}'}" />
</StackPanel>

在这里插入图片描述

异步按钮

DialogService可以显示异步按钮。这些按钮指示关联的异步操作是否正在进行

public void ShowRegistrationForm()
{UICommand registerAsyncCommand = new UICommand(id: null,caption: "Register Async",command: new AsyncCommand<CancelEventArgs>(async cancelArgs => {try{await MyAsyncExecuteMethod();}catch (Exception e){AsyncMessageBoxService.ShowMessage(e.Message, "Error", MessageButton.OK);cancelArgs.Cancel = true;}},cancelArgs => !string.IsNullOrEmpty(registrationViewModel.UserName)),asyncDisplayMode: AsyncDisplayMode.Wait,isDefault: false,isCancel: false);UICommand registerCommand = new UICommand(id: null,caption: "Register",command: new DelegateCommand<CancelEventArgs>(cancelArgs => {try{MyExecuteMethod();}catch (Exception e){AsyncMessageBoxService.ShowMessage(e.Message, "Error", MessageButton.OK);cancelArgs.Cancel = true;}},cancelArgs => !string.IsNullOrEmpty(registrationViewModel.UserName) && !((IAsyncCommand)registerAsyncCommand.Command).IsExecuting),isDefault: true,isCancel: false);UICommand cancelCommand = new UICommand(id: MessageBoxResult.Cancel,caption: "Cancel",command: null,isDefault: false,isCancel: true);UICommand result = AsyncDialogService.ShowDialog(dialogCommands: new List<UICommand>() { registerAsyncCommand, registerCommand, cancelCommand },title: "Registration Dialog",viewModel: registrationViewModel);if (result == registerCommand){// ...}
}void MyExecuteMethod()
{// ...
}async Task MyAsyncExecuteMethod()
{await Task.Delay(2000);// ...
}

在这里插入图片描述

点击“Register Async”,执行异步方法

在这里插入图片描述

参考

  • DialogService | WPF Controls | DevExpress Documentation

  • Showing Dialogs When Using the MVVM Pattern in WPF or UWP - CodeProject

  • 如何在 WPF/MVVM 中将参数传递给对话框 | DevExpress 支持 — How to pass param to dialog in WPF/MVVM | DevExpress Support

  • Implementing Dialog Boxes in MVVM - CodeProject

  • 对话服务 | WPF 控件 | DevExpress 文档 — DialogService | WPF Controls | DevExpress Documentation

  • DX消息框服务| WPF 控件 | DevExpress 文档 — DXMessageBoxService | WPF Controls | DevExpress Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19437.shtml

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

相关文章

基于Spring前后端分离版本的论坛系统-自动化测试

目录 前言 一、测试环境 二、环境部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 注册页面 登录页面 版块 帖子 用户个人中心页 站内信 4.3、界面测试 注册页面 登录页面 版块 帖子 用户个人中心页…

Redis实战篇3:优惠券秒杀

说明 该实战篇基于某马的Redis课程中的《某马点评项目》。非常适合有相关经验、缺少企业级解决方案&#xff0c;或者想要复习的人观看&#xff0c;全篇都会一步一步的推导其为什么要这么做&#xff0c;分析其优缺点&#xff0c;达到能够应用的地步。 本实战篇中心思想就是把项目…

Mariadb操作命令指南

MariaDB简介 ​ 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性&#xff0c;因使用而带来的风险与本站无关&#xff01; 数据库应用程序与主应用程序分开存在&#xff0c;并存储数据集合。 每个数据库都使用一个或多个API来创建&#xff0c;访问&#xf…

分立元件实现稳压

电路原理图 优点&#xff1a;电压精度高&#xff0c;可以调整输出电压 缺点&#xff1a;压差大时效率较低&#xff0c;发热严重。 参考连接 TL431-高效5V精密稳压器-电路知识干货 (qq.com)https://mp.weixin.qq.com/s?__bizMzkxNzIxNTc5OQ&mid2247484878&idx1&…

操作系统教材第6版——个人笔记1

第一章 计算机操作系统概述 操作系统是计算机系统中最重要的系统软件&#xff0c;它统一管理计算机系统的硬件资源与信息资源&#xff0c;控制与调度上层软件的执行并为其提供易于使用的接口。从资源管理、程序控制、操作控制、人机交互、程序接口、系统结构6个角度深入观察操…

Github 如何配置 PNPM 的 CI 环境

最近出于兴趣在写一个前端框架 echox&#xff0c;然后在 Github 上给它配置了最简单的 CI 环境&#xff0c;这里简单记录一下。 特殊目录 首先需要在项目根目录里面创建 Github 仓库中的一个特殊目录&#xff1a;.github/workflows&#xff0c;用于存放 Github Actions 的工作…

269 基于matlab的四连杆机构动力学参数计算

基于matlab的四连杆机构动力学参数计算。将抽油机简化为4连杆机构&#xff0c;仿真出悬点的位移、速度、加速度、扭矩因数、游梁转角等参数&#xff0c;并绘出图形。程序已调通&#xff0c;可直接运行。 269机构动力学参数计算 位移、速度、加速度 - 小红书 (xiaohongshu.com)

段码屏|液晶显示模块|超低功耗LCD驱动芯片

1 简介 PC164S32 是一款支持 128 点 (32 4)显示 的多功能 LCD 控制器芯片&#xff0c;内部存储器RAM数据直接映射到 LCD 显示。可软件配置特性使其适用于包括 LCD 模块和显示子系统在内的多种 LCD 应用。主控制器与 PC164S32接口仅需3 或 4 条线。内置的省电模式极大的降低了功…

我给线程池管理框架hippo4j找bug

1 虚拟机参数不生效 hippo4j的docker启动脚本位于 docker/docker-startup.sh 。从下图可以看到 JAVA_OPT放在了jar包名 hippo4j-server.jar之后&#xff0c;而只有项目参数才放在jar包名之后。 实际上这里JAVA_OPT中包含虚拟机参数&#xff0c;而虚拟机参数要放在jar包名之前…

使用 CNN 训练自己的数据集

CNN&#xff08;练习数据集&#xff09; 1.导包&#xff1a;2.导入数据集&#xff1a;3. 使用image_dataset_from_directory()将数据加载tf.data.Dataset中&#xff1a;4. 查看数据集中的一部分图像&#xff0c;以及它们对应的标签&#xff1a;5.迭代数据集 train_ds&#xff0…

【漏洞复现】DT-高清车牌识别摄像机 任意文件读取漏洞

0x01 产品简介 DT-高清 车牌识别摄像机是一款先进的安防设备&#xff0c;采用高清图像传感器和先进的识别算法&#xff0c;能够精准、快速地识别车牌信息。其高清晰该摄像机结合了智能识别技术&#xff0c;支持实时监宴图像质量确保在各种光照和天气条件下都能准确捕捉车牌信息…

【面试八股总结】MySQL事务:事务特性、事务并行、事务的隔离级别

参考资料&#xff1a;小林coding 一、事务的特性ACID 原子性&#xff08;Atomicity&#xff09; 一个事务是一个不可分割的工作单位&#xff0c;事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。原子性是通过 undo …

C#根据数据量自动排版标签的样例

这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…

代码随想录算法训练营第四十五天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 视频讲解&#xff1a; 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 解题思路 直接将这一些石头&#xff0c;分为两堆&#xff0c;让他们尽可能…

C语言 | Leetcode C语言题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; int minimumTotal(int** triangle, int triangleSize, int* triangleColSize) {int f[triangleSize];memset(f, 0, sizeof(f));f[0] triangle[0][0];for (int i 1; i < triangleSize; i) {f[i] f[i - 1] triangle[i][i];for (int j …

【excel】设置二级联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 之前做完了 【excel】设置可变下拉菜单&#xff08;一级联动下拉菜单&#xff09;&#xff0c;开始做二级联动菜单。 【需求】在…

python实现——综合类型数据挖掘任务(无监督的分类任务)

综合类型数据挖掘任务 航空公司客户价值分析。航空公司客户价值分析。航空公司客户价值分析。航空公司已积累了大量的会员档案信息和其乘坐航班记录&#xff08;air_data.csv&#xff09;&#xff0c;以2014年3月31日为结束时间抽取两年内有乘机记录的所有客户的详细数据。利用…

万界星空科技MES系统功能介绍

制造执行系统或MES 是一个全面的动态软件系统&#xff0c;用于监视、跟踪、记录和控制从原材料到成品的制造过程。MES在企业资源规划(ERP) 和过程控制系统之间提供了一个功能层&#xff0c;为决策者提供了提高车间效率和优化生产所需的数据。 万界星空科技MES 系统基础功能&am…

【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码

打造属于你的精彩短视频平台 一、引言&#xff1a;为何选择短剧系统小程序&#xff1f; 在当今数字化时代&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分。而短剧系统小程序源码&#xff0c;作为构建短视频平台的强大工具&#xff0c;为广大开发者提供了快速搭建…

03-树1 树的同构(浙大数据结构PTA习题)

03-树1 树的同构 分数 25 作者 陈越 单位 浙江大学 给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G…