显然 .NET 月历在不同平台上的呈现方式不同。 Vista 上的日历比 XP 日历更宽。
我想让日历在所有平台上都很好且精确地契合。 有没有办法做到这一点,而无需测量和硬编码不同的宽度?
..............
编辑/更正: 日历似乎根据您选择的主题呈现不同的效果:
如何弥补?
这是预期的行为。如果您不想受到主题的影响,请完全禁用主题(即不要执行命令
Application.EnableVisualStyles();
)。否则,不同的主题总是会产生不同的控件外观(正如它们的本意)。如果您想始终适应控件,请使用更流畅的布局,利用锚点和停靠。
我遇到了同样的问题并找到了解决方法:
当在运行时显示(如在表单中)时,
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 中的区域设置:将格式更改为例如丹麦语。再次运行程序,你会看到宽度变小了,因为丹麦的 MonthCalender 控件变小了。
关于
AutoSize
和 AutoSizeMode
属性,它们可用于使窗体的大小适应 MonthCalender 控件的大小。做这个:
将form中的两个属性更改为:
现在运行程序,您将看到窗体的大小根据 MonthCalender 控件的大小自动变化:
就是这样! (记得将您的区域格式设置切换回原来的格式)
好吧,我发现了这个:
http://www.eggheadcafe.com/software/aspnet/34174436/vista-monthcalendar-control.aspx
欢迎再次来到 Microsoft Manage 新闻组,我是叶志新,这是我的 很高兴在这个问题上与您合作。
MonthCalendar 控件由操作系统渲染,因此被渲染 XP 和 Vista 之间有所不同。您可以使用 Environment.OSVersion.Version.Major 属性确定操作系统版本, 并调用 MontheCalendar.GetPreferredSize() 方法来检索首选 Vista 上的大小,以便您可以通过编程方式更改表单的大小 使其适合 MonthCalendar。同时,打开AutoSize属性 将表单的值设置为 true,以便表单在 Vista 上调整大小,并确保 MonthCalendar 的 Dock 属性设置为 Dock.None。
供您参考的示例代码:
private void Form1_Load(对象发送者,EventArgs e) {
if (Environment.OSVersion.Version.Major >= 6) { this.Size = this.monthCalendar1.GetPreferredSize(new 尺寸()); } }
请尝试我的建议,并让我知道它对您是否有意义。如果 您有任何问题或疑虑,请随时告诉我。
最诚挚的问候, 叶志新 Microsoft 管理的新闻组支持团队
似乎有一个专门针对这个问题设计的方法:
this.monthCalendar1.GetPreferredSize(new Size());
但是,我在多台机器上测试了此方法,并且无论主题或操作系统如何,都会为您提供 178 px 的首选宽度。 (据我测试)。 !?
所以,受够了,我只是打算给日历宽度为 178,并计划购买商业控件或类似的东西。 感谢您的帮助...
我的应用程序正在使用 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;
}
...