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.rhkb.cn/news/338103.html

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

相关文章

“手撕”链表的九道OJ习题

目录 1. 第一题 2. 第二题 3. 第三题 4. 第四题 5. 第五题 6. 第六题 7. 第七题 8. 第八题 9. 第九题 1. 第一题 删除链表中等于给定值 val 的所有节点。OJ链接 思路如下&#xff1a; 相当于链表的removeAll();制定prev和cur&#xff0c;prev记录前一个节点&#xff…

2021JSP普及组第三题:插入排序

2021JSP普及组第三题 题目&#xff1a; 思路&#xff1a; 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置&#xff0c;所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置&#xff0c;所以建立一个新…

作业 递归应用

已完成&#xff1a;7 #include <iostream> using namespace std; long long f(long long,long long); int main(){long long n,m;cin>>n>>m;cout<<f(m,n);return 0; } long long f(long long a,long long b){if(a%b0){return b;}return f(b,a%b); } #i…

RedisSearch与Elasticsearch:技术对比与选择指南

码到三十五 &#xff1a; 个人主页 数据时代&#xff0c;全文搜索已经成为许多应用程序中不可或缺的一部分。RedisSearch和Elasticsearch是两个流行的搜索解决方案&#xff0c;它们各自具有独特的特点和优势。本文简单探讨一些RedisSearch和Elasticsearch之间的技术差异。 目录…

软件测试基础

目录 一.基础 1.概念 1.1 什么是软件测试&#xff1f; 1.2 什么是需求&#xff1f; 1.3 什么是测试用例&#xff1f; 1.4 为什么需要测试用例&#xff1f; 1.5 什么是BUG&#xff1f; 1.6 软件生命周期 2.开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量模型、迭代模型…

从零到一建设数据中台 - 关键技术汇总

一、数据中台关键技术汇总 语言框架&#xff1a;Java、Maven、Spring Boot 数据分布式采集&#xff1a;Flume、Sqoop、kettle 数据分布式存储&#xff1a;Hadoop HDFS 离线批处理计算&#xff1a;MapReduce、Spark、Flink 实时流式计算&#xff1a;Storm/Spark Streaming、…

(CPU/GPU)粒子继承贴图颜色发射

GetRandomInfo节点(复制贴进scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…

安装软件缺少dll文件怎么办,分享多种解决dll问题的方法

在计算机使用过程中&#xff0c;我们经常会遇到安装软件时提示缺少dll文件的问题。这种情况通常会导致软件无法正常运行或启动。为了解决这个问题&#xff0c;我总结了以下五种方法&#xff0c;希望对大家有所帮助。 一&#xff0c;了解DLL文件是什么 动态链接库&#xff08;D…

连通块中点的数量-java

本次我们通过连通块中点的数量来加深我们对并查集的基本操作和原理&#xff0c;并且知道如何在并查集中添加附属信息。 目录 前言☀ 一、连通块中点的数量☀ 二、算法思路☀ 1.无向图&#x1f319; 2.在a b之间连一条边&#xff0c;a b可能相等&#x1f319; 3.询问a和b是否在一…

Java | Leetcode Java题解之第122题买卖股票的最佳时机II

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int ans 0;int n prices.length;for (int i 1; i < n; i) {ans Math.max(0, prices[i] - prices[i - 1]);}return ans;} }

一维时间序列信号的小波模极大值分解与重建(matlab R2018A)

数学上称无限次可导函数是光滑的或没有奇异性&#xff0c;若函数在某处有间断或某阶导数不连续&#xff0c;则称函数在此处有奇异性&#xff0c;该点就是奇异点。奇异性反映了信号的不规则程度&#xff0c;因为信号的奇异点和突变部分往往携带者重要信息&#xff0c;因此信号的…

传感器和变送器的区别介绍

从它的名称来看&#xff0c;传与感二字。传是指传输&#xff0c;感是指感知。实际上是先有感知&#xff0c;其次转换&#xff0c;最后传输。因此传输是目的&#xff0c;转换是手段&#xff0c;感知是基础。把能够将被测变量&#xff08;温度、压力、液位、流量&#xff09;感知…

Go-Admin后台管理系统源码(GO+VUE)编译与部署

1.克隆源码: # Get backend code git clone https://github.com/go-admin-team/go-admin.git# Get the front-end code git clone https://github.com/go-admin-team/go-admin-ui.git3.下载并安装GO开发环境: 3.编译管理后台后端 # Enter the go-admin backend project cd ./…

数据结构——经典链表OJ(二)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

Rasa.3X中使用lookup实现对实体的抽取

rasa3.6的DIETClassifier实体提取器不准确&#xff0c;使用RegexEntityExtractor的实体提取器替换。在实战过程解决以下两个问题&#xff1a; 1、RegexEntityExtractor实体提取器的应用 首先在domain.yml中明确对应的实体以及意图&#xff1a; version: "3.0" ent…

认识JAVA中的异常

目录&#xff1a; 一. 异常概念与体系结构 二. 异常的处理 三. 自定义异常类 一. 异常概念与体系结构: 1 异常的概念:在 Java 中&#xff0c;将程序执行过程中发生的 不正常行为 称为异常&#xff0c; 如&#xff1a;算数异常&#xff1a; ArithmeticException System.out.pri…

Dijkstra求最短路篇一(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)

前言&#xff1a; Dijkstra算法博客讲解分为两篇讲解&#xff0c;这两篇博客对所有有难点的问题都会讲解&#xff0c;小白也能很好理解。看完这两篇博客后保证收获满满。 本篇博客讲解朴素Dijkstra算法&#xff0c;第二篇博客讲解堆优化Dijkstra算法Dijkstra求最短路篇二(全网…

Day45 动态规划part05

LC1049最后一块石头重量II(未掌握) 未掌握分析&#xff1a;其实本题跟LC416分割等和子集类似&#xff0c;本质上题目的要求是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;也就是01背包问题weight和value都是stones数组&#xff0c;题目可以看…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合&#xff0c;随机丢弃神经元 -----------------…

调用上传文件接口出现格式错误

一、造成这种错误的可能有很多 1.检查一下传递格式 2.检查一下接口要求的格式 二、举个例子 这两个有什么区别&#xff1f; 那就是json、和form-data&#xff0c;一定要看仔细接口 如果还是按照json的方式去传就会报错 三、更改header里Content-Type的类型 json等的heade…