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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…

CameraProvider启动流程

从Android 8.0之后&#xff0c;Android 引入Treble机制&#xff0c;主要是为了解决目前Android 版本之间升级麻烦的问题&#xff0c;将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离&#xff0c;一旦适配了一个版本的vendor信息之后&#xff0c;之…

告别低效提问:掌握BARD技巧,让AI成为你的智能助手!

今天只聊一个主题&#xff1a;提示词 Prompt。 说到提示词&#xff0c;大家可能都看过GPT的高级示例&#xff0c;那些几百字的提示词&#xff0c;写起来确实不容易。 那么&#xff0c;如何写出同样效果的提示词呢&#xff1f; 有没有什么公式或者系统学习的方法&#xff1f;…

在CentOS7下构建TeamSpeak服务器并增加网易云点歌插件

文章目录 部署TeamSpeak创建一个新用户下载并解压服务端下载解压 启动服务端同意许可协议启动与配置开放端口设置开机自启 客户端连接 部署TS3AudioBot并添加网易云插件安装ffmpeg下载TS3AudioBot本体与插件并解压配置TS3AudioBot启动设置开机自启 部署网易云API安装git安装Nod…

5.23R语言-参数假设检验

理论 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是统计学中用来比较多个样本均值之间差异的一种方法。它通过将总变异分解为不同来源的变异来检测因子对响应变量的影响。方差分析广泛应用于实验设计、质量控制、医学研究等领域。 方差分析的基本模型 方差…

ReDos攻击浅析

DOS为拒绝服务攻击&#xff0c;re则是由于正则表达式使用不当&#xff0c;陷入正则引擎的回溯陷阱导致服务崩溃&#xff0c;大量消耗后台性能 正则 ​ 探讨redos攻击之前&#xff0c;首先了解下正则的一些知识 执行过程 大体的执行过程分为: 编译 -> 执行编译过程中&…

Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解还在写0.0… 文章目录 系列…

MySQL 命令总结篇-思维导图

一些常用命令以思维导图形式总结在这里了&#xff0c;掌握这些进行MySQL基本操作绝对没问题&#xff0c;加油&#xff01;友友们可以根据这些思维导图进行知识总结。 目录 一、快速上手 二、SQL 语句分类&#xff08;DDL、DML、DQL、DCL&#xff09; 三、数据类型 四、约束…

数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)

目录 Noise Attack1 高斯噪声&#xff08;Gaussian Noise&#xff09;2 椒盐噪声&#xff08;Salt and Pepper Noise&#xff09;3 泊松噪声&#xff08;Poisson Noise&#xff09;4 斑点噪声&#xff08;Speckle Noise&#xff09;5 完整代码 参考博客&#xff1a;Python…

零基础学会asp.net做网站/公众号/小程序之三:实战初体验(简单程序教学)

关注我&#xff0c;持续分享逻辑思维&管理思维&面试题&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 博主在互联网大厂深耕近二十年&#xff0c;从一线码农做起&#xff0c;到人工智能公司副总裁。希望把过往经验总结出来&#xff0…

对称二叉树(oj题)

一、题目链接https://leetcode-cn.com/problems/symmetric-tree/ 二、题目思路 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称的思路: 1.将该树的左子树和右子树&#xff0c;当做两棵树&#xff0c;调用 判断两棵树是否对称相等的函数 2.判断两颗树是否对称相…

【网络安全】Web安全学习-前言及先导

一、网络安全概述 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因遭到破坏、更改、泄露&#xff0c;系统能连续可靠的正常运行&#xff0c;网络服务不中断。简单来说。就是要保障我们的网络环境安全稳定&#xff0c;不被人破…

深入理解linux文件系统与日志分析

深入理解linux文件系统与日志分析 linux文件系统: 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;元信息&#xff08;文件的属性 权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block…

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【核心动画-关键帧动画-CAKeyframeAnimation Objective-C语言】

一、接下来,我们来说这个关键帧动画, 1.我们把之前的基本动画,这一坨代码,备份到test1方法里边, 然后,开始说我们的关键帧动画,步骤都是一样的,都是三大步: // 关键帧动画 // 1.做什么动画 // 2.怎么做动画 // 3.对谁做动画 1)做什么动画 第一,我们现在要创建…

计算机图形学入门04:视图变换

1.MVP变换 将虚拟场景中的模型投影到屏幕上&#xff0c;也就是二维平面上&#xff0c;需要分三个变换。 1.首先需要知道模型的位置&#xff0c;也就是前面提到的基本变换&#xff0c;像缩放、平移&#xff0c;旋转&#xff0c;也称为模型(Model)变换。 2.然后需要知道从…

STM32定时器与PWM对LED灯的控制

文章目录 一、定时器——Timer&#xff08;一&#xff09;概念&#xff08;二&#xff09;分类&#xff08;三&#xff09;功能&#xff08;四&#xff09;结构1.模块一——时基单元2.模块二——输出比较模块 二、实验内容&#xff08;一&#xff09;标准库点亮LED灯1.实验说明…

99.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色信息显示的界面与功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

新型 Meterpreter 后门能够在图片中隐藏恶意代码

据Cyber Security News消息&#xff0c;ANY.RUN 沙盒分析了一种被称为Meterpreter 的新型后门恶意软件&#xff0c;能利用复杂的隐写技术将恶意有效载荷隐藏在看似无害的图片文件中。 基于Meterpreter的攻击从一个包含 PowerShell 脚本的 .NET 可执行文件开始&#xff0c;该脚…

解决VSCode右键没有Open In Default Browser问题

在VSCode进行Web小程序测试时&#xff0c;我们在新建的HTML文件中输入 !会自动生成页面代码骨架&#xff0c;写入内容后&#xff0c;我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案&#xff1a;首先在VSCode找…