显然,.NET monthcalendar在不同平台上的呈现方式不同。 Vista上的日历比XP日历更宽。
我希望在所有平台上都能很好地准确地使用日历。 有没有办法做到这一点,而不必测量和硬编码不同的宽度?
..............
编辑/更正: 根据您选择的主题,日历似乎会有不同的呈现方式:
如何弥补这一点?
答案 0 :(得分:3)
这是预期的行为。如果您不想受主题影响,请完全禁用主题(即不执行命令Application.EnableVisualStyles();
)。否则,不同的主题将始终为控件产生不同的外观(正如它们所要做的那样)。如果您想要随时调整控件,请使用更流畅的布局,使用锚点和对接。
答案 1 :(得分:3)
我遇到了同样的问题并找到了解决方法:
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中更改区域设置:将格式更改为例如丹麦。再次运行程序,你会看到宽度变得更小,因为丹麦月份日历控制较小。
关于AutoSize
和AutoSizeMode
属性,可以使用它们使表单的大小适应MonthCalender控件的大小。做这个:
将表单中的两个属性更改为:
现在运行该程序,您将看到表单的大小会根据MonthCalender控件的大小自动更改:
就是这样! (记得将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;
}
...