WPF HandyControl 界面交互反馈:对话框+加载框+列表选择

这篇具有很好参考价值的文章主要介绍了WPF HandyControl 界面交互反馈:对话框+加载框+列表选择。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我学了HandyControl的基础使用,但是发现HandyControl 封装了基础的消息提示,但是没有封装基础的交互逻辑。可能是因为我写了Uniapp,我知道封装了基础的交互其实一般就够用了。

Uniapp 界面交互反馈

我现在觉得,代码要低耦合一点,每个模块都纯粹一点,这一次我就不添加Nlog日志打印了。

仓库地址

因为最后代码比较多,我就放在仓库里了

gclove2000 / WPF HandyControl 交互

相关链接

HandyControl Github地址

HandyControl 官方中文文档

WPF-UI HandyControl 简单介绍

WPF-UI HandyControl 控件简单实战+IconPacks矢量图导入

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉

HandyControl使用

HandyControl Dialog 对话框

顺便再装一个CommunityToolkit.MVVM

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

官方Demo使用

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

<Border x:Class="HandyControlDemo.UserControl.TextDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:langs="clr-namespace:HandyControlDemo.Properties.Langs"
        xmlns:ex="clr-namespace:HandyControlDemo.Tools.Extension"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        CornerRadius="10"
        Width="400"
        Height="247"
        Background="{DynamicResource RegionBrush}">
    <hc:SimplePanel>
        <TextBlock Style="{StaticResource TextBlockLargeBold}" Text="{ex:Lang Key={x:Static langs:LangKeys.PleaseWait}}"/>
        <Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource PrimaryBrush}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,4,4,0"/>    
    </hc:SimplePanel>
</Border>
namespace HandyControlDemo.UserControl
{
    public partial class TextDialog
    {
        public TextDialog()
        {
            InitializeComponent();
        }
    }
}

我现在才知道,原来想要弹窗的边框为圆角,要将UserControl改为Border
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

代码调用

按钮加个显示就可以了

Dialog.Show(new TextDialogView());

使用效果

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

异步回调

虽然HandyControl实现了这个功能,但是文档写的很少
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

没办法继续下去了,只能进代码里面看看了
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

代码实现

TextDialogView.xaml
<Border x:Class="WpfApp1.Views.TextDialogView"
        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:local="clr-namespace:WpfApp1.Views"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        xmlns:ViewModels="clr-namespace:WpfApp1.ViewModels"
        Width="400"
        Height="247"
        CornerRadius="20"
        Background="{DynamicResource RegionBrush}"
        mc:Ignorable="d">
    <Border.DataContext>
        <ViewModels:TextDialogViewModel />
    </Border.DataContext>
    <hc:SimplePanel>
        <StackPanel VerticalAlignment="Center">
            <TextBlock Style="{StaticResource TextBlockLargeBold}"
                       Text="消息提示" />
            <TextBox Text="{Binding TestContent}"
                     hc:InfoElement.Placeholder="请输入文本"
                     Style="{StaticResource TextBoxExtend}"  />
        </StackPanel>

        <Button Width="22"
                Height="22"
                Command="hc:ControlCommands.Close"
                Style="{StaticResource ButtonIcon}"
                Foreground="{DynamicResource PrimaryBrush}"
                hc:IconElement.Geometry="{StaticResource ErrorGeometry}"
                Padding="0"
                HorizontalAlignment="Right"
                VerticalAlignment="Top"
                Margin="0,4,4,0" />
    </hc:SimplePanel>

</Border>

TextDialogView.xaml.cs
 public partial class TextDialogViewModel : ObservableObject, IDialogResultable<string>
{

    [ObservableProperty]
    private string testContent = "";

    public TextDialogViewModel()
    {

    }

    /// <summary>
    /// 这个是回调的结果
    /// </summary>
    public string Result
    {
        get => TestContent; set
        {
            TestContent = value;
        }
    }
    /// <summary>
    /// 这个暂时我不知道有啥用
    /// </summary>
    public Action CloseAction { get; set; }
}
方法调用
        public RelayCommand ShowTextDialogBtn => new RelayCommand(async()=> await ShowText() );


        private async Task ShowText()
        {
            var res = await Dialog.Show<TextDialogView>()
            .Initialize<TextDialogViewModel>(vm => vm.TestContent = "")
            .GetResultAsync<string>();
            MessageBox.Show(res);
        }
显示结果

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

取消弹窗

HandyControl给了我们两个取消弹窗的方式

方法1:直接取消

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

方法2:接口调用

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

C#调用线程必须为 STA,因为许多 UI 组件都需要。

如果出现了以下问题,要注意窗口线程是不能开启新的线程的

C#调用线程必须为 STA,因为许多 UI 组件都需要。

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

遮罩点击

我找了一天了,还是没找到方法

【WPF】查找父/子控件(元素、节点)

How could I close a Interactive Dialog when clicking outside #1272

哎,看起来还是得用点奇技淫巧

设计思路

额,可能说的比较复杂。简单来说就是背景点击的时候,对话框没点击,那就是外侧点击了。

代码逻辑

TextDialogView.xaml
<Border x:Class="WpfApp1.Views.TextDialogView"
        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:local="clr-namespace:WpfApp1.Views"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        xmlns:ViewModels="clr-namespace:WpfApp1.ViewModels"
        Width="400"
        Height="247"
        CornerRadius="20"
        
        Background="{DynamicResource RegionBrush}"
        mc:Ignorable="d">
    <Border.DataContext>
        <ViewModels:TextDialogViewModel />
    </Border.DataContext>
    <hc:SimplePanel>
        <StackPanel VerticalAlignment="Center">
            <TextBlock Style="{StaticResource TextBlockLargeBold}"
                       Text="消息提示" />
            <TextBox Text="{Binding TestContent}"
                     hc:InfoElement.Placeholder="请输入文本"
                     Style="{StaticResource TextBoxExtend}"  />
        </StackPanel>

        <Button Width="22"
                Height="22"
                Command="hc:ControlCommands.Close"
                Style="{StaticResource ButtonIcon}"
                Foreground="{DynamicResource PrimaryBrush}"
                hc:IconElement.Geometry="{StaticResource ErrorGeometry}"
                Padding="0"
                HorizontalAlignment="Right"
                VerticalAlignment="Top"
                Margin="0,4,4,0" />
    </hc:SimplePanel>

</Border>

TextDialogView.xaml.cs
    /// <summary>
    /// TextDialogView.xaml 的交互逻辑
    /// </summary>
    public partial class TextDialogView
    {
        public TextDialogView()
        {
            InitializeComponent();
            //将本身指针传给ViewModel
            (this.DataContext as TextDialogViewModel).TextDialogView = this;
        }
    }
TextDialogViewModel
 public partial class TextDialogViewModel : ObservableObject, IDialogResultable<string>
 {

     [ObservableProperty]
     private string testContent = "";

     public bool IsClick { get; set; }

     private TextDialogView textDialogView;

     /// <summary>
     /// 拿到TextDialogView的时候,添加点击函数
     /// </summary>
     public TextDialogView TextDialogView
     {
         get => textDialogView;
         set
         {
             textDialogView = value;
             textDialogView.MouseLeftButtonDown += (sender, e) =>
             {
                 IsClick = true;
             };
             textDialogView.MouseLeftButtonUp += (sender, e) =>
             {
                 IsClick = false;
             };
             textDialogView.MouseLeave += (sender, e) =>
             {
                 IsClick = false;
             };
         }
     }

     public TextDialogViewModel()
     {

     }

     /// <summary>
     /// 这个是回调的结果
     /// </summary>
     public string Result
     {
         get => TestContent; set
         {
             TestContent = value;
         }
     }
     /// <summary>
     /// 这个暂时我不知道有啥用
     /// </summary>
     public Action CloseAction { get; set; }


 }

运行结果

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

方法设计

Uniapp 将界面交互分为

  • 消息提示
  • 加载
  • 输入框
  • 列表选择

这个其实已经包含了大部分的交互内容了,如果想自定义,可以自己去研究一下。由于HandyControl已经封装了消息控件了,拿我们就封装另外三个功能了。

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

代码封装

由于代码比较复杂,我这里就放我的设计思路了。

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

我把详细的代码放在Gtiee仓库里面了

gclove2000 / WPF HandyControl 交互

静态方法

我把交互改成了静态的方法。
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互
WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互

运行结果

WPF HandyControl 界面交互反馈:对话框+加载框+列表选择,WPF 入门知识,wpf,交互文章来源地址https://www.toymoban.com/news/detail-804179.html

到了这里,关于WPF HandyControl 界面交互反馈:对话框+加载框+列表选择的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 简易图形界面库easygui 对话框大全

    目录 ​编辑 easygui 安装 导入 对话框 1. 消息框 msgbox 2. 确认框 ccbox 3. 布尔框 boolbox 4. 是否框 ynbox 5. 选择框 choicebox 6. 整数输入框 integerbox 7. 按钮选择框 buttonbox 8. 单行文本框 enterbox 9. 多行文本框 textbox C: pip install easygui Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecti

    2024年02月04日
    浏览(31)
  • Python 简易图形界面库easygui 对话框大全(续)

    目录 EasyGUI库 主要特点 使用场景 对话框样式 10. 文件打开框 fileopenbox 11. 文件保存框 filesavebox 12. 目录打开框 diropenbox 13. 索引对话框 indexbox 14. 例外报告框 exceptionbox 15. 代码文本框 codebox 16. 密码输入框 passwordbox 17. 多重文本框 multenterbox 18. 组合密码框 multpasswordbox 19. 多项选择

    2024年02月03日
    浏览(26)
  • Python 图形化界面基础篇:使用弹出窗口和对话框

    在开发图形用户界面( GUI )应用程序时,与用户进行交互的一种常见方式是通过弹出窗口和对话框。这些弹出窗口允许用户输入数据、进行选择、查看信息等。 Python 的 Tkinter 库和一些第三方库提供了创建和管理弹出窗口和对话框的方法。在本篇博客中,我们将深入探讨如何

    2024年02月03日
    浏览(46)
  • 【pyqt5界面化工具开发-8】窗口开发-QDialog对话框

    目录 一、调用父类的菜单 二、添加更多的布局在对话框内 和前面Qwedget一样的结构(不做过多介绍) 可以参考代码中的注释 这和前面讲的Qwedget窗口布局基本上一样了 运行结果:

    2024年02月11日
    浏览(35)
  • Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框

    本文是项目中关于 弹窗界面 设计的技术分享,通过 FluentAvalonia + DialogHost.Avalonia 开源nuget包来实现项目中需要 弹框显示的界面 和所有的 对话框 的展示。 效果如下: 本项目是基于Avalonia的GPT的AI会话项目。采用的是最新稳定版本 11.0.0-rc1.1 。希望通过该项目了解和学习Avalon

    2024年02月16日
    浏览(42)
  • QT调用不同UI界面响应,对话框跳转到主页面UI,用信号与槽传递信息,两级信号传递

    在MainWindow界面有一个按键”新建”,点击后需要生成一个输入对话框,实例用到了processDialog类对象。 我新建一行数据完成后,需要更新MainWindow表格的视图,此时就需要调用写在MainWIndow下的函数MainWindow::showProcess(vectorPCB* readyQueue) 但是如果实例化一个MainWidow对象,此时修改的

    2024年02月12日
    浏览(32)
  • python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 Entry 单行输入框 用户可输入内容 Frame 容器 用于装载其他GUI组件 Label 标签 用于显示不可编辑

    2024年02月12日
    浏览(36)
  • 【windows编程之对话框】对话框原理,对话框的创建

    在本章节中我们来讲解Windows/Win32编程中对话框的原理和对话框的创建,我们在前几篇章节中讲解到了普通窗口中回调函数的处理,在普通窗口的窗口消息处理函数(回调函数)中,系统会首先调用我们自己写的回调函数,我们自己编写的回调函数没有处理的消息,才会交给系

    2024年02月03日
    浏览(66)
  • 对话框之模式对话框与无模式对话框以及自定义消息

    模式对话框 创建模式对话框步骤 创建模式对话框模板 IDD_COptionsDialog 构造一个CDialog对象,并封装对话框模板 调用CDialog:Domal()显示对话框 无模式对话框 创建对话框模板 IDD_COptionsDialog 构造一个CDialog对象,并封装进对话框模板 单击菜单项显示无模式对话框

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包