.net 根据调用类库的位置,字体对齐冲突

.net 根据调用类库的位置,字体对齐冲突,.net,vb.net,winforms,.net,Vb.net,Winforms,这与其说是出于必要性,不如说是出于好奇: 处境 我一直在开发一个类库,在某种程度上,它有一个表单,可以生成按钮的“网格”,每个按钮列的顶部都有一个标签。这些按钮的生成都是通过代码动态完成的。这些按钮都是格式化的,因此它们都以“矩阵式”样式对齐,并添加到面板中。在每个按钮中,我都有一个文本值(“1”到“5”)。顶部的标题标签包含分析年份文本(类似于“01”到“60”或“001”到“100”,具体取决于用户指定的分析年份-我匹配数字的数量,以便它们都很好地对齐)。输出如下所示: 当我调用这个库并在

这与其说是出于必要性,不如说是出于好奇:

处境 我一直在开发一个类库,在某种程度上,它有一个表单,可以生成按钮的“网格”,每个按钮列的顶部都有一个标签。这些按钮的生成都是通过代码动态完成的。这些按钮都是格式化的,因此它们都以“矩阵式”样式对齐,并添加到面板中。在每个按钮中,我都有一个文本值(“1”到“5”)。顶部的标题标签包含分析年份文本(类似于“01”到“60”或“001”到“100”,具体取决于用户指定的分析年份-我匹配数字的数量,以便它们都很好地对齐)。输出如下所示:

当我调用这个库并在开发人员环境中测试它时,一切看起来都很好(如上所示)。奇怪的是,当我编译此库并将其部署到主应用程序中时,文本会被截断,不再适合其控制,如下所示:

我知道windows窗体在处理分辨率和调整控件大小方面非常糟糕,但我不明白为什么只有在部署之后才会发生这种情况。也许我从主应用程序继承了一些字体大小,但我不明白为什么这会覆盖代码中的显式字体集

代码
Private Const PAD=15'//控件周围的间距
Private\u runningYearWidth为整数
Private _xPoints作为(整数的)列表
私有点作为列表(整数)
专用子生成矩阵()
Dim n=\u profile.ComponentProfiles.Count'//y值
Dim m=_AnalysisPeriod'//x值
“//生成组件标签
'.....   
“//生成年份标签
_xPoints=新列表(整数)
_运行年宽度=PAD
对于i=1到m
作为新标签的Dim lbl
FormatYearLabel(lbl、i、i.ToString)
下一个
“//生成矩阵按钮
对于i=1到n
对于j=1到m
将btn变暗为新按钮
'//N.B.此函数仅生成按钮并将其对齐到网格中。
“//需要运行模型才能用值填充这些控件
FormatMatrixButton(btn,j,i)
下一个
下一个
端接头
Private Readonly _yearFont=新字体(“Segoe UI”,9,FontStyle.Bold)
私有子格式YearLabel(l作为标签,索引作为整数,yearText作为字符串)
常数y=5
尺寸x=_运行年宽度
yearText=FormatYearText(yearText)//如果分析年份为2位数,则返回年份(1)的“01”
Dim w=GetFontWidth(_yearFont,yearText)+2'/+1像素任一侧
Dim h=GetFontHeight(_yearFont,yearText)+2'//+1像素任一侧
与l
.Font=\u yearFont
.TextAlign=ContentAlignment.TopCenter
.宽度=w
.高度=h
.Text=yearText
.位置=新点(x,y)
.Name=String.Format(“lblYear{0}”,索引)
以
PanelMatrixDeteration.Controls.Add(l)
_runningYearWidth+=(w+PAD)//X下一年的订单标签
_xPoints.AddRange({l.left,l.right})
端接头
私有函数GetFontWidth(f为字体,txt为字符串)为整数
Dim g=panelMatrixComponents.CreateGraphics()
返回g.MeasureString(txt,f).宽度
端函数
Private Readonly _matrixFont=新字体(“Consolas”,9,FontStyle.Bold)
私有子格式MatrixButton(b为按钮,x为整数,y为整数)
“//获取此按钮与以前生成的轴标签关联的对齐点
左上角尺寸=新点(_xPoints((x-1)*2),_yPoints((y-1)*2))
右下角尺寸=新点(_xPoints((x-1)*2+1),_yPoints((y-1)*2+1))
与b
.Font=_matrixFont
.位置=左上角
.Width=(右下角.X-左上角.X)
.Height=(右下角.Y-左上角.Y)
.Name=String.Format(“btn{0}{1}”,x,y)
.FlatStyle=FlatStyle.Flat
AddHandler.Click,矩阵的地址按钮单击
以
PanelMatrixDeteration.Controls.Add(b)
端接头
'//======================运行模型。。。。
基本上,上面的代码显示的是标签的大小(边界)基于每个标签中文本的测量宽度。矩阵中按钮的大小(边界)与标题或“轴”处的标签对齐

注意:上面没有显示y轴(_yPoints),但逻辑与x轴非常相似

最后 现在,我已经做了一个快速修复,并在每个控件周围添加了一些额外的间距,当我编译库并在部署的应用程序中运行它时,它看起来很好——只是稍微大一点


我想知道的是,为什么会有不同的视觉行为,而这些行为只会根据调用库的位置而变得明显

我还在WinForms环境中动态创建了很多控件。我经常需要设置
this.AutoScaleMode=AutoScaleMode.Inherit以使类似的内容在不同的环境中正确显示。我不能保证这会解决你的问题,因为这不完全是我所经历的行为。但是,多年来,这种设置使我避免了在办公桌上碰头的时刻。请尝试
AutoScaleMode.Inherit
AutoScaleMode.Font
(WinForms designer使用的)或
。没有
,但您可能会因此失去一些功能。@jaredbaszler感谢您的建议。我尝试了
.Inherit
.Font
。无
,但部署时仍然得到相同的结果。可能这只是label控件上的填充和/或边距问题。看起来标签只是在顶部加了1-3个像素。尝试显式设置两个属性
.Padding
.Margin
。这并不能解释为什么这种情况会在不同的环境中发生变化,但它可以在不必调整环境的情况下修复它