不同(平台)上的月日历宽度,更正:主题(XP 与 Aero 主题)

问题描述 投票:0回答:4

显然 .NET 月历在不同平台上的呈现方式不同。 Vista 上的日历比 XP 日历更宽。

我想让日历在所有平台上都很好且精确地契合。 有没有办法做到这一点,而无需测量和硬编码不同的宽度?

..............

编辑/更正: 日历似乎根据您选择的主题呈现不同的效果:

enter image description here

如何弥补?

c# .net windows winforms controls
4个回答
3
投票

这是预期的行为。如果您不想受到主题的影响,请完全禁用主题(即不要执行命令

Application.EnableVisualStyles();
)。否则,不同的主题总是会产生不同的控件外观(正如它们的本意)。如果您想始终适应控件,请使用更流畅的布局,利用锚点和停靠。


3
投票

我遇到了同样的问题并找到了解决方法:

当在运行时显示(如在表单中)时,

MonthCalendar
控件的尺寸似乎已正确更新。

使用表单的

Shown
事件等来了解尺寸何时更新。

您还可以将窗体的

AutoSize
属性设置为
true
,将
AutoSizeMode
设置为
GrowAndShrink
,使窗体自动适合
MonthCalendar
控件。

更新:

有关更多详细信息,请尝试此示例:

在窗体上放置一个 MonthCalendar 控件,如下所示:

Form with MonthCalender control

表单的显示的事件中添加以下内容:

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中的两个属性更改为:

Form's properties (Visual Studio)

现在运行程序,您将看到窗体的大小根据 MonthCalender 控件的大小自动变化:

Result

就是这样! (记得将您的区域格式设置切换回原来的格式)


0
投票

好吧,我发现了这个:

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,并计划购买商业控件或类似的东西。 感谢您的帮助...


0
投票

我的应用程序正在使用 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

© www.soinside.com 2019 - 2024. All rights reserved.