不同(平台)上的 MonthCalendar 宽度,更正:主题(XP 与 Aero 主题)
Posted
技术标签:
【中文标题】不同(平台)上的 MonthCalendar 宽度,更正:主题(XP 与 Aero 主题)【英文标题】:MonthCalendar width on different (platforms), correction: themes (XP vs Aero theme) 【发布时间】:2011-08-31 20:22:44 【问题描述】:显然 .NET 月历在不同平台上的呈现方式不同。 Vista 上的日历比 XP 日历宽。
我想让日历在所有平台上都完美而精确。 有没有办法做到这一点,而不必测量和硬编码不同的宽度?
.......
编辑/更正: 根据您选择的主题,日历的呈现方式似乎有所不同:
如何弥补?
【问题讨论】:
两个平台的分辨率一样吗? 日历根据平台呈现不同,与屏幕分辨率无关... 【参考方案1】:这是预期的行为。如果您不想受主题影响,请完全禁用主题(即不要执行命令Application.EnableVisualStyles();
)。否则,不同的主题将始终为控件产生不同的外观(正如它们所要做的那样)。如果您想始终适应控件,请使用更流畅的布局,利用锚点和停靠。
【讨论】:
但是不调用Application.EnableVisualStyles会导致其他问题,比如ListView不能正确渲染所有视图...***.com/questions/2874295/… 然后,如果您既希望启用视觉样式并希望控件适合,另一种选择是使用流畅的布局。此外,如果 ListView 给您带来问题,请将其外观设置为平面。 你能解释一下流畅布局是什么意思吗? 我的意思是利用锚定和对接。这里有一些关于这个主题的好读物:***.com/questions/770094/… 和 voidspace.org.uk/ironpython/winforms/part7.shtml 不客气,不要那么悲观。想想 Web 开发人员试图调整 ie6/ie7/ie8/ff3/ff4/chrome/.... 的大小:)【参考方案2】:我遇到了同样的问题并找到了解决方法:
MonthCalendar
控件的尺寸似乎在运行时显示(如表单)时正确更新。
使用例如表单的Shown
事件来了解维度何时更新。
您还可以将表单的AutoSize
属性设置为true
,将AutoSizeMode
设置为GrowAndShrink
,以使表单自动适应MonthCalendar
控件。
更新:
有关更多详细信息,请尝试以下示例:
在这样的表单上放置一个 MonthCalendar 控件:
在表单的显示的事件中添加:
public static int CalenderWidth = 0, CalenderHeight = 0;
private void Form1_Shown(object sender, EventArgs e)
CalenderWidth = monthCalendar1.Width;
CalenderHeight = monthCalendar1.Height;
MessageBox.Show("MonthControl width: " + CalenderWidth.ToString() +
", height: " + CalenderHeight.ToString());
当程序运行时,您将看到一个显示正确尺寸的消息框。 宽度和高度也被放入两个变量中,您可以在程序的任何地方使用(我知道,以一种快速而肮脏的方式;-) 当然,如果您不想要,可以省略消息框。
要检查它是否真的有效,请尝试更改 Windows 中的区域设置:将格式更改为例如丹麦语。再次运行程序,您会看到 Width 变小了,因为丹麦 MonthCalender 控件变小了。
关于AutoSize
和AutoSizeMode
属性,它们可用于使表单的大小适应MonthCalender 控件的大小。做这个:
将form中的两个属性改成这样:
现在运行程序,你会看到表单的大小会根据 MonthCalender 控件的大小自动改变:
就是这样! (记得将您的区域格式设置切换回原来的设置)
;-) 戴夫
【讨论】:
您是否有一些代码可以分享来说明Shown
事件和您提到的AutoSize
技术的使用?
我现在添加了一个例子 ;-)【参考方案3】:
好吧,我找到了这个:
http://www.eggheadcafe.com/software/aspnet/34174436/vista-monthcalendar-control.aspx
再次欢迎来到微软管理新闻组,我是叶志新,这是我的 很高兴在这个问题上与您合作。
MonthCalendar 控件由操作系统呈现,因此被呈现 XP和Vista的区别。您可以使用 Environment.OSVersion.Version.Major 属性确定操作系统版本, 并调用 MontheCalendar.GetPreferredSize() 方法来检索首选 Vista 上的大小,以便您可以通过编程方式更改表单的大小 使其适合 MonthCalendar。同时,转动 AutoSize 属性 将表单设置为 true,以便表单在 Vista 上调整大小,并确保 MonthCalendar 的 Dock 属性设置为 Dock.None。
供您参考的示例代码:
private void Form1_Load(object sender, EventArgs e)
如果(环境.OSVersion.Version.Major >= 6) this.Size = this.monthCalendar1.GetPreferredSize(新 尺寸());
请尝试我的建议,让我知道这对您是否有意义。如果 您有任何问题或疑虑,请随时告诉我。
最好的问候, 叶志新 Microsoft 托管新闻组支持团队
似乎有专门针对这个问题设计的方法:
this.monthCalendar1.GetPreferredSize(new Size());
但是,我在多台机器上测试了此方法,无论主题或操作系统如何,都会始终为您提供 178 像素的首选宽度。 (据我测试)。 !?
所以,受够了,我就把日历的宽度设置为 178,并计划购买一个商业控件或类似的东西。 谢谢大家的帮助...
【讨论】:
【参考方案4】:我的应用正在使用 Application.EnableVisualStyles(); 我在 CreateHandle() 方法中禁用了日历视觉样式:
public class MonthCalendarBuffered : MonthCalendar
protected override void CreateHandle()
Application.VisualStyleState = VisualStyleState.NoneEnabled;
// disables Application.UseVisualStyles
base.CreateHandle();
// restore setting
Application.VisualStyleState = VisualStyleState.ClientAndNonClientAreasEnabled;
...
在以下位置检查日历控件源: http://referencesource.microsoft.com/#System.Windows.Forms/ndp/fx/src/winforms/Managed/System/WinForms/MonthCalendar.cs
【讨论】:
你能在你的答案上花费。它似乎在视觉工作室设计师中工作。但是当我启动我的应用程序时,样式似乎恢复为默认值。以上是关于不同(平台)上的 MonthCalendar 宽度,更正:主题(XP 与 Aero 主题)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MonthCalendar 在 3rd 方应用程序中看起来不同?