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

时间:2011-05-24 10:58:42

标签: c# .net windows winforms controls

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

我希望在所有平台上都能很好地准确地使用日历。 有没有办法做到这一点,而不必测量和硬编码不同的宽度?

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

编辑/更正: 根据您选择的主题,日历似乎会有不同的呈现方式:

enter image description here

如何弥补这一点?

4 个答案:

答案 0 :(得分:3)

这是预期的行为。如果您不想受主题影响,请完全禁用主题(即不执行命令Application.EnableVisualStyles();)。否则,不同的主题将始终为控件产生不同的外观(正如它们所要做的那样)。如果您想要随时调整控件,请使用更流畅的布局,使用锚点和对接。

答案 1 :(得分: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中更改区域设置:将格式更改为例如丹麦。再次运行程序,你会看到宽度变得更小,因为丹麦月份日历控制较小。

关于AutoSizeAutoSizeMode属性,可以使用它们使表单的大小适应MonthCalender控件的大小。做这个: 将表单中的两个属性更改为:

Form's properties (Visual Studio)

现在运行该程序,您将看到表单的大小会根据MonthCalender控件的大小自动更改:

Result

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

;-)戴夫

答案 2 :(得分:0)

好吧,我发现了这个:

http://www.eggheadcafe.com/software/aspnet/34174436/vista-monthcalendar-control.aspx

  

欢迎再次访问微软管理新闻组,我是叶志新,这是我的   很高兴在这个问题上与你合作。

     

MonthCalendar控件由OS呈现,因此呈现   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)   {

     

if(Environment.OSVersion.Version.Major> = 6)   {   this.Size = this.monthCalendar1.GetPreferredSize(new   尺寸());   }   }

     

请尝试我的建议并告诉我你是否有意义。如果   如有任何问题或疑虑,请随时与我们联系。

     

最诚挚的问候,   叶志新   Microsoft托管新闻组支持团队

似乎有一种专门为此问题设计的方法:

this.monthCalendar1.GetPreferredSize(new Size());

但是,我在多台计算机上测试了此方法,无论主题或操作系统如何,都会为您提供178 px的首选宽度。 (就我测试而言)。 !?

所以,厌倦了,我只是给日历宽度178,并计划购买商业控制或类似的东西。 感谢所有的帮助...

答案 3 :(得分: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