NET WPF使用组件库HandyControl

news2024/12/23 6:29:17
一、背景

WPF原生控件提供的API功能不够强大,设置一般的功能都需要进行很复杂的配置和实现。

1.1 原生按钮控件

例如,原生控件<Button/> 默认效果是这样的:

MainWindow.xaml代码:

<Window x:Class="wpf_demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf_demo"
        mc:Ignorable="d"
        Title="主页" Height="450" Width="800">
    <Grid>
        <VirtualizingStackPanel>
            <Button Content="这是一个按钮"/>
        </VirtualizingStackPanel>
    </Grid>
</Window>

按钮

按钮-鼠标悬浮

  • 问题1:按钮如果不设置高和宽,宽度默认占满窗口。期望有一个默认的常规的高和宽。

  • 问题2:当鼠标悬浮在按钮上时,会默认高亮且颜色为天蓝色。没有提供相关属性来去掉鼠标悬浮效果,且高亮颜色也不能更改。

1.2 自定义按钮控件

为了方便我们自己控制按钮,我们放弃采用原生<Button/> 控件,转而采用<Border/>控件来模拟按钮的效果,但这种实现太过臃肿和复杂。

<Window x:Class="wpf_demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf_demo"
        mc:Ignorable="d"
        Title="主页" Height="450" Width="800">
    <Grid>
        <VirtualizingStackPanel>
            <Border Height="25" Width="100" HorizontalAlignment="Left" BorderBrush="#FFAFAEAE" BorderThickness="1" Background="#FF6BA731"  >
                <TextBlock MouseLeftButtonUp="ButtonAction" Text="自定义按钮" Foreground="White" TextAlignment="Center" VerticalAlignment="Center"/>
                <Border.Style>
                    <Style TargetType="Border">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Cursor" Value="Hand" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
        </VirtualizingStackPanel>
    </Grid>
</Window>

自定义按钮效果

二、解决方案

使用开源框架覆盖原生控件默认的样式,并丰富控件API

三、使用开源框架HandyControl

以下操作步骤,来源于官网文档 HandyControl官网

3.1 Nuget的方式引用控件库

Nuget

搜索HandyControl,并进行安装

安装HandyControl

安装成功后,在项目的 【依赖项】-【包】下会显示刚才安装的HandyControl,并有对应的版本号。

安装成功

3.2 在App.xaml中添加以下代码

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
3.3 在App.xaml中添加命名空间

xmlns:hc="https://handyorg.github.io/handycontrol"

App.xaml完整代码如下:

<Application x:Class="wpf_demo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:local="clr-namespace:wpf_demo"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
3.4 页面代码

在MainWindow.xaml中添加命名空间

xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl"

MainWindow.xaml代码:

<Window x:Class="laser.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl"
        xmlns:local="clr-namespace:laser"
        mc:Ignorable="d"
        Title="主页" Height="450" Width="800">
    <Grid>
        <VirtualizingStackPanel>
            <Button Content="这是一个按钮"/>

            <Button Content="连接" Width="60" Height="25" Margin="0 20 0 0" Background="#FF6BA731" Foreground="White" BorderBrush="#FFAFAEAE" BorderThickness="1" controls:BorderElement.CornerRadius="0"/>
        </VirtualizingStackPanel>
    </Grid>
</Window>
3.5 效果

原来写的原生控件<Button/>代码完全不用动,默认样式就已经被覆盖修改了。效果如下:

效果

四、HandyControl提示框
4.1 MessageBoxWindow.xaml

<Window x:Class="wpf_demo.MessageBoxWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        xmlns:local="clr-namespace:wpf_demo"
        mc:Ignorable="d"
        Title="提示框" Height="450" Width="800">
    <Grid>

        <VirtualizingStackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Width="100" Click="SuccessAction" Height="30" Margin="0 0 10 0">成功</Button>
            <Button Width="100" Click ="FailAction" Height="30">失败</Button>
        </VirtualizingStackPanel>
    </Grid>
</Window>
4.2 MessageBoxWindow.xaml.cs


using System.Windows;
using MessageBox = HandyControl.Controls.MessageBox;

namespace wpf_demo
{
    public partial class MessageBoxWindow : Window
    {
        public MessageBoxWindow()
        {
            InitializeComponent();

        }

        private void SuccessAction(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
        }

        private void FailAction(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("失败", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}

注意,要引入using MessageBox = HandyControl.Controls.MessageBox;,才会覆盖WPF原生提示框效果。

4.3 效果

成功

失败

五、国际化问题
5.1 问题描述

在英文系统下,MessageBox弹框按钮依然显示为中文,如下图【确定】按钮显示未中文。

using MessageBox = HandyControl.Controls.MessageBox;

MessageBox.Show("Success", "Tip", MessageBoxButton.OK, MessageBoxImage.Information);

弹框国际化按钮问题

5.2 解决方案

安装英文版HandyControl

HandyControl英文版

中英文

按钮显示英文

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

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

相关文章

SAP_ABAP_编程基础

SAP ABAP 顾问能力模型(同心圆方法论)_sap abap 顾问能力模型(同心圆方法论)-CSDN博客文章浏览阅读1.8k次,点赞5次,收藏35次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!_sap abap 顾问能力模型(同心圆方法论)htt…

我们的Python服务器开发脚手架开放了

pdServer是我们实践过程中的产物&#xff0c;当我们在开发各类python应用时&#xff0c;经常需要一个server来提供服务。于是我们使用fastApi来提实现&#xff0c;并在这个过程中不断的完善&#xff0c;实现了JWT\SQL等。 我们的脚手架项目可以&#xff1a; fastApi实现一个服…

数据线电子行业MES系统功能与生产过程管理

万界星空科技针对数据线电子行业的MES系统&#xff08;制造执行系统&#xff09;&#xff0c;其具体功能、生产过程管理以及注塑机设备数据采集等方面&#xff0c;可以详细介绍如下&#xff1a; 一、电子行业MES系统具体功能 计划管理&#xff1a; MES系统能够根据客户需求和销…

潍坊网站建设-高端建站

在当今数字化时代&#xff0c;企业的在线形象越来越重要。潍坊作为一个经济发展迅速的城市&#xff0c;许多企业都意识到拥有一个高端网站的重要性。潍坊网站建设不仅仅是技术层面的开发&#xff0c;更是品牌形象和市场竞争力的体现。高端建站的核心在于用户体验、视觉设计和功…

论文解读《NewsBench:一个评估中文新闻大型语言模型编辑能力的系统评估框架》

引言&#xff1a;感觉这篇文章&#xff0c;对 LLMs 的新闻编辑能力做了一个详细的实验和分析&#xff0c;而且还贡献了一个宝贵的中文新闻数据集&#xff0c;蛮不错的&#xff0c;后面或许可以用起来&#xff0c;就拜读了一下。 这篇博客的题目说是解读&#xff0c;其实大部分…

赵进喜:不透析、不用肾移植,“三维护肾”巧治尿毒症

潜心研究中医药治疗尿毒症等慢性肾脏重症40余年来&#xff0c;北京名老中医&#xff0c;慢性肾病国医大师吕仁和教授医术传承人&#xff0c;全国优秀基层名中医赵进喜总结出弥足珍贵的重症良方&#xff0c;临床应用无数次守护近10万肾病重症患者生命。让仅有22岁的慢性肾衰尿毒…

DORIS - DORIS之倒排索引

什么是倒排索引&#xff1f; 倒排索引&#xff08;Inverted index&#xff09;&#xff0c;也常被称为反向索引、置入档案或反向档案&#xff0c;是一种索引方法&#xff0c;用于存储在全文搜索场景下某个单词在一个文档或者一组文档中的存储位置的映射&#xff0c;它是文档检…

AI开发-FAQ

1 需求 2 接口 3.1 pip下载指定版本 pip install package1.0.4 3.2 pip设置代理 pip install --proxyhttp://10.10.1.10:3128 somepackage 3.3 PyCharm设置代理 import os os.environ[http_proxy] http://your_proxy:port os.environ[https_proxy] http://your_proxy:portf…

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2&#xff1a;击穿 1.3&#xff1a;缓存雪崩 1.4:双写一致 1.5.持久化&#xff08;RDB,AOF&#xff09; 1.6…

80V降24V2A同步降压WT6037

80V降24V2A同步降压WT6037 WT6037是一款适用于36V-80V输入电压范围&#xff0c;输出24V2A电流的同步降压恒压芯片。该芯片具有宽输入电压范围&#xff0c;高转换效率&#xff0c;低静态电流消耗等特点&#xff0c;可广泛应用于电池组系统&#xff0c;电动自行车&#xff0c;电动…

SD-WAN网络如何实现双向访问?

在SD-WAN架构中&#xff0c;双向访问是一个重要的概念&#xff0c;它允许网络流量在不同方向上流动&#xff0c;从分支机构到数据中心或云端&#xff0c;再从数据中心或云端返回分支机构。本文将详细探讨SD-WAN如何实现双向访问&#xff0c;并解释其背后的工作原理。 什么是双向…

对话世优科技CEO纪智辉:AI模型让数字人发展按下加速键

2024年9月12日&#xff0c;中国国际服务贸易交易会全球服务贸易峰会在北京举行&#xff0c;世优科技作为深耕虚拟数字人领域的科技企业&#xff0c;聚焦“新而专”&#xff0c;连续两届参加服贸会。2024年&#xff0c;世优科技以合作供应商身份参与本届服贸会。 在AI的大浪潮下…

Jetpack Compose Side Effects in Details 副作用的详细信息

What is Side Effect’s? 副作用是什么&#xff1f; Side Effects is a change in the state of the application that occurs outside the scope of the composable function and is not related to the UI. In non-UI related state changes, our screen may recompose mor…

一、机器学习算法与实践_02KNN算法笔记

1、KNN基本介绍 1.1 定义 KNN&#xff08;K-NearestNeighbor&#xff0c;即&#xff1a;K最邻近算法&#xff09;是一种基于实例的学习方法&#xff0c;用于分类和回归任务&#xff0c;它通过查找一个数据点的最近邻居来预测该数据点的标签或数值。 所谓K最近邻&#xff0c;…

性能测试-性能分析与调优原理总结

性能分析与调优如何下手&#xff0c;先从硬件开始&#xff0c;还是先从代码或数据库。 从操作系统&#xff08;CPU调度&#xff0c;内存管理&#xff0c;进程调度&#xff0c;磁盘I/O&#xff09;、网络、协议&#xff08;HTTP&#xff0c; TCP/IP &#xff09;&#xff0c;还是…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…

【Elasticsearch系列二】安装 Kibana

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

seafaring寻找漏洞

一.命令执行漏洞 &#xff08;1&#xff09;下面有一个输入框&#xff0c;输入ls进行查看 &#xff08;2&#xff09;输入echo <?php phpinfo();?> > qxl.php 并且访问 (3)写入一句话木马&#xff0c;并且访问蚁剑连接 echo <?php eval($_POST[cmd];?>>…

1T机械硬盘需要分区吗?你必须知道的分区知识

随着科技的不断发展&#xff0c;计算机存储设备的容量日益增大&#xff0c;1T(1TB&#xff0c;即1024GB)机械硬盘已成为许多电脑用户的标配。然而&#xff0c;在这样一个大容量硬盘面前&#xff0c;很多用户都会面临一个问题&#xff1a;是否需要对这块硬盘进行分区&#xff1f…

electron有关mac构建

针对 Mac M1/2/3 芯片的设备&#xff0c;proces.archarm64. 执行下面命令&#xff0c;检查下按照的 node.js 版本是不是 intel x64 指令集&#xff0c;如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令&#xff1a;node -p process.arch 对应的node版本也是arm版 …