winform-SunnyUI控件解决大小位置变化

简介: winform-SunnyUI控件解决大小位置变化

前言

最近在做.net的项目,而个人对于.net仅限于能写点代码,样式相关的内容是一概不同,不得已最近边学边干,期间碰到了多种多样的问题故此对这些内容进行整理。


问题种类


使用SunnyUI解决控件DPI问题(分辨率问题)


项目在做技术选型的时候没有考虑好会有分辨率的问题导致直接选用了winform,之前一直做B/S开发,现在到C/S开发这点没有考虑好,首先这里避坑的话可以用WPF这个框架,它这个会自适应分辨率的问题,好了现在说一下解决的方案。


1.添加配置文件app.manifest



2.将配置文件中dpiAware打开



3.添加uiStyleManager1控件并将控件中DPIScale设置为true



4.效果图



使用FlowLayOutPanel解决控件边距问题


1.问题样式


可以看到这里切换了语言后新增这个按钮将旁边的按钮遮盖了。


2.使用FlowLayOutPanel搭配控件自带的Margin属性


首先窗体添加FlowLayOutPanel控件


添加控件后将我们需要进行设置固定边距的控件放入,然后设置按钮控件的Margin属性



3.效果图



使用SunnyUIUIButton控件以及UISymbolButton自适应大小


1.UIButton控件AutoSize属性设置后不触发问题


因为项目中需要切换语言,就导致切换语言后文本长度发生变化,对应的控件也要自动去匹配文本长度,但是UIButton在属性界面设置了以后程序运行期间并没有生效,所以这里排查是因为UIButton的AutoSize属性默认是false,需要在程序运行的时候修改为true,也就是在窗体加载事件中,或者窗体构造函数中将UIButton的AutoSize设置为true。

UIButton的AutoSize属性初始化配置。

2.解决UISymbolButton控件没有AutoSize属性,并且设置后无效问题


UISymbolButton的AutoSize可以看到它是直接给设定了只能为false,也就是说就算调用set给AutoSize属性赋值也是false。



解决方式就是检测UISymbolButton控件的TextChanged事件,当控件的文本发生变化时会触发这个事件,那么就可以在这个事件中控件的大小进行修改,以符合文本长度。

· 添加事件


· 自定义刷新控件大小

 

/// <summary>
        /// 刷新控件大小,在文本内容发生变化时
        /// </summary>
        /// <param name="button"></param>
        private void AdjustButtonSize(UISymbolButton button)
        {
            // 使用 MeasureString 方法计算文本的大小
            using (var g = button.CreateGraphics())
            {
                var textSize = g.MeasureString(button.Text, button.Font);
                // 中文 调整按钮的大小
                button.Width = (int)textSize.Width + 60; // 可根据需要添加一些额外的空白区域
                button.Height = (int)textSize.Height + 14;
                //英文
                button.Width = (int)textSize.Width + 60; // 可根据需要添加一些额外的空白区域
                button.Height = (int)textSize.Height + 14;
            }
        }


· 在TextChanged中调用该方法

private void btnAdd_TextChanged(object sender, EventArgs e)
        {
            AdjustButtonSize((sender as UISymbolButton));
        }


总结


winform中Margin属性


使用Margin属性可以在控件之间或控件与容器之间创建空白区域,以实现更灵活的布局。通过调整Margin属性的值,可以控制控件的间距和外观,从而满足特定的界面需求。


Margin属性是一个Padding结构类型,用于指定控件的上、下、左、右四个方向的间距。

Padding结构有四个属性:Top、Bottom、Left、Right,分别表示上、下、左、右方向的间距。


winform中MeasureString方法


MeasureString方法是Graphics类中的一个方法,用于测量给定字符串在指定字体和大小下的宽度和高度。该方法返回一个SizeF对象,其中包含测量结果的宽度和高度。

public SizeF MeasureString(string text, Font font);

参数说明:


text:要测量的字符串。

font:要应用于字符串的字体。

UISymbolButton自适应大小的问题就是通过这个方法解决的。


winform中FlowLayOutPanel控件


FlowLayoutPanel控件是一个面板容器,它按照水平或垂直方向流动排列其子控件。

FlowLayoutPanel控件适用于动态调整大小和位置的控件集合,可以根据容器的大小自动重新布局子控件。

FlowLayoutPanel控件提供了一种自动流动布局的方式,使子控件可以根据空间的可用性自动调整位置。

子控件可以按照添加的顺序依次排列,或者可以根据特定的布局样式进行排序。

FlowLayoutPanel控件提供了一些属性和方法,用于控制子控件的间距、对齐方式、换行行为等。

通过设置FlowLayoutPanel控件的Dock属性或将其放置在其他容器控件中,可以实现更复杂的布局。

它解决了上面控件布局问题,也就是控件发生大小变化后与之相邻的控件边距不会发生变化,这样项目的样式整体看着就协调了。

还要一个与FlowLayOutPanel控件功能类似的控件是TableLayoutPanel控件,它是一个表格布局容器。

相关文章
|
API 图形学
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
自定义控件的本质只有两点:重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围;重绘图形,在原有Region范围内,重绘不同的图形(圆角、多边形、图片等)作为背景......
494 0
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
|
2月前
Qt 控件大小随着窗口的大小而变化设置
Qt 控件大小随着窗口的大小而变化设置
84 0
|
算法 API C#
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
1424 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
|
C# 图形学 Windows
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化...尝试介绍很常见的圆角效果,通过重写控件的OnPaint方法实现绘制,并在后面进一步探索对应的优化和可能的问题
1105 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
|
C#
WPF获取某控件的位置,也就是偏移量
原文:WPF获取某控件的位置,也就是偏移量 此段示例在MSDN中可见。XAML代码如下:   1、如果只需要获取相对于其父级的偏移量,则可以使用以下方法: // Return the offset vector for the TextBlock object.
1421 0
|
C# 前端开发
WPF如何得到一个在用户控件内部的元素的坐标位置
原文:WPF如何得到一个在用户控件内部的元素的坐标位置 例如有这样一个用户控件: 这是主窗口: ...
1392 0
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
873 0
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
动态控制SAP C4C UI元素的显示和隐藏
动态控制SAP C4C UI元素的显示和隐藏
动态控制SAP C4C UI元素的显示和隐藏
|
SQL
【实现】表单控件里的子控件的变化。
     前情回顾: 【实现】表单控件的UI布局,实现方式         上一篇说的是表单布局上的变化,也就是通过TR、TD的设置,实现了多行多列的效果。那么格子画好了,我们 可以往里面放控件了。
863 0
|
C#
WPF通过EventTrigger改变其他控件的值
原文:WPF通过EventTrigger改变其他控件的值 场景:点击TextBox后弹出Poppup 原理:使用EventTrigger后触发StoryBoard,通过StoryBoard改变其他控件的值。
2735 0