不同(平台)上的 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 控件变小了。

关于AutoSizeAutoSizeMode 属性,它们可用于使表单的大小适应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 主题)的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7 中的 MonthCalendar 不同

为啥 MonthCalendar 在 3rd 方应用程序中看起来不同?

chrome 和 safari 上的打印宽度不同

MonthCalendar.SelectionRange 数据绑定示例

MonthCalendar 颜色不变

MonthCalendar - 禁用天数