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

news2025/1/19 3:01:21

说明:

  • 完整代码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.coloradmin.cn/o/1719858.html

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

相关文章

FFmpeg 中 Filters 使用文档介绍

描述 这份文档描述了由libavfilter库提供的过滤器Filters、源sources和接收器sinks。 滤镜介绍 FFmpeg通过libavfilter库启用过滤功能。在libavfilter中,一个过滤器可以有多个输入和多个输出。为了说明可能的类型,我们考虑以下过滤器图: 这个过滤器图将输入流分成两个流,然…

微信小程序-wx.showToast超长文字展示不全

wx.showToast超长文字展示不全 问题解决方法1 问题 根据官方文档&#xff0c;iconnone&#xff0c;最多显示两行文字。所以如果提示信息较多&#xff0c;超过两行&#xff0c;就需要用其他方式解决。 解决方法1 使用vant组件里面的tost 根据官方例子使用&#xff1a; 1、在…

实用软件分享---- i茅台 在windows上自动预约和自动获取小茅运的软件

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

设计模式22——备忘录模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 备忘录模式&#xff08;Mement…

Unity 资源 之 100+风格化武器包-幻想RPG资源分享

Unity 资源 之 100风格化武器包-幻想RPG资源分享 前言资源包内容领取兑换码 前言 在游戏开发的广阔天地中&#xff0c;Unity 一直是备受青睐的强大引擎。而今天&#xff0c;我们要着重为大家介绍一个令人瞩目的 Unity 资源——100风格化武器包-幻想 RPG。 这个武器包就像是一…

移植其他命令行Vivado IDE的工具

移植其他命令行Vivado IDE的工具 介绍 本章介绍如何迁移各种AMD命令行工具以在AMD中使用 Vivado™集成设计环境&#xff08;IDE&#xff09;。 迁移ISE Partgen命令行工具 ISE™Design Suite Partgen工具可获得&#xff1a; •系统上安装的所有设备的信息 •详细的包装信息 您可…

2.5Bump Mapping 凹凸映射

一、Bump Mapping 介绍 我们想要在屏幕上绘制物体的细节&#xff0c;从尺度上讲&#xff0c;一个物体的细节分为&#xff1a;宏观、中观、微观宏观尺度中其特征会覆盖多个像素&#xff0c;中观尺度只覆盖几个像素&#xff0c;微观尺度的特征就会小于一个像素宏观尺度是由顶点或…

谷歌上架,可以用云手机来完成开发者个人号“20+14”封测?

根据谷歌的政策要求&#xff0c;自2023年11月13日之后创建的个人开发者账号&#xff0c;其应用必须满足20人连续14天封闭测试的要求&#xff0c;才能在Google Play 中上架正式版应用。 20人连续测试14天&#xff0c;这对大多数开发者&#xff0c;尤其是那些采用矩阵方式上架的开…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接

参考: https://310.ai/copilot 可以通过自然语言通话晚上蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质。利用Protei…

neutron学习小结

概述 基于yoga版本学习neutron&#xff0c;通过源码、官方文档、部署环境进行学习 neutron-dhcp-agent neutron.agent.dhcp_agent.main 创建server&#xff0c;调oslo_service launch server&#xff0c;最后实际调了server的start方法 neutron.service.Service.start Serv…

编程入门(七)【虚拟机VMware安装Linux系统Ubuntu】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;Ubuntu知多少&#x1f680;安装的前期准备&am…

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

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

冯喜运:5.31晚间黄金原油行情分析及尾盘操作策略

【黄金消息面分析】&#xff1a;周五&#xff08;5月31日&#xff09;&#xff0c;最新发布的数据显示&#xff0c;美国4月核心PCE物价指数月率录得0.2%&#xff0c;低于预期(0.3%)&#xff0c;经济学家认为&#xff0c;核心指数比整体指数更能反映通胀。除此之外&#xff0c;美…

电子阅览室能给孩子做什么

电子阅览室为孩子提供了很多活动和资源&#xff0c;可以为他们提供以下服务&#xff1a; 1. 提供电子书籍和儿童读物&#xff1a;电子阅览室通常提供大量的电子书籍和儿童读物&#xff0c;供孩子选择阅读。 2. 提供儿童学习资源&#xff1a;专久智能电子阅览室可以提供各种学习…

收银系统源码-千呼新零售2.0【智慧供应链】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

【HTML】通过焦点,获取部分上下文内容

【HTML】通过焦点&#xff0c;获取部分上下文内容 需求 用户从页面中选择部分文字描述&#xff0c;获取这段选中文字&#xff0c;并获取该文字、上两段、下两段内容&#xff0c;作为上下文输入 效果说明 选中绿色框内文字&#xff0c;将黄色框内文字作为上下文传递 代码实…

HackTheBox-Machines--Mirai

Mirai 测试过程 1 信息收集 NMAP 80 端口 指纹识别 目录扫描 http://10.129.141.121/versions http://10.129.141.121/admin 检查 /admin 下接口&#xff0c;发现 http://10.129.141.121/admin/index.php?login 请求&#xff0c;仅密码未知&#xff0c;可以尝试对密码进行爆…

C++青少年简明教程:While和Do-while循环语句

C青少年简明教程&#xff1a;While和Do-while循环语句 C的while和do-while语句都是循环控制语句&#xff0c;用于重复执行一段代码。while语句在循环开始前检查循环条件&#xff0c;而do-while语句在循环结束后检查循环条件。 使用while循环时&#xff0c;如果需要在每次迭代前…

网络安全基础技术扫盲篇名词解释之“证书“

用通俗易懂的话说&#xff1a; 证书就好比是一张身份证&#xff08;类似&#xff0c;但不完全相同&#xff09;&#xff0c;用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样&#xff0c;电脑在连接一个网站时&#xff0c;也会查看网站的证…

VS2017中使用qt翻译家,除ui界面外其他用tr包裹的字符串在翻译家中显示为乱码

1、ui界面中的中文,可以正常显示 2、其他用tr包裹的字符串,显示为乱码 3、解决 改为utf8保存。 然后更新翻译文件,重新打开发现已经ok了。 参考博客: https://blog.csdn.net/zhou714534957/article/details/124948822 https://blog.csdn.net/weixin_52689816/article/d…