显然.NET月历在不同的平台上呈现不同。Vista上的日历比XP上的日历宽。我想让日历在所有平台上都能很好地匹配和精确。有没有一种方法可以做到这一点,而不必测量和硬编码不同的宽度?..............编辑/更正:日历似乎会根据您选择的主题以不同的方式呈现:
如何弥补这一点?
xam8gpfp1#
这是预期的行为。如果你不想受主题的影响,完全禁用主题(即。不要执行命令Application.EnableVisualStyles();)。否则,不同的主题总是会产生不同的控件外观(因为它们本来就是这样做的)。如果你想在任何时候都适合控件,使用一个更流畅的布局,利用锚点和对接。
Application.EnableVisualStyles();
iyr7buue2#
我遇到了同样的问题,找到了一个解决方案:看起来MonthCalendar控件的尺寸在运行时显示(如表单)时会正确更新。例如,使用表单的Shown事件来了解维度何时更新。还可以将窗体的AutoSize属性设置为true,将AutoSizeMode设置为GrowAndShrink,以使窗体自动适应MonthCalendar控件。更新:有关更多详细信息,请尝试以下示例:将MonthCalendar控件放在这样的窗体上:
MonthCalendar
Shown
AutoSize
true
AutoSizeMode
GrowAndShrink
在表单的Shown事件中添加以下内容:
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控件的大小自动更改:
就是这样!(记得将您的区域格式设置切换回原始格式)
bq8i3lrv3#
我发现了这个http://www.eggheadcafe.com/software/aspnet/34174436/vista-monthcalendar-control.aspx欢迎再次来到微软管理新闻组,我是叶志新,很高兴能和大家一起讨论这个问题。MonthCalendar控件由操作系统呈现,因此在XP和Vista之间呈现不同。您可以使用Environment. OSVersion. Version. Major属性来确定OS版本,并调用MontheCalendar. GetErrorRedSize()方法来检索Vista上的首选大小,以便您可以通过编程方式更改窗体的大小,使其适合MonthCalendar。同时,将窗体的AutoSize属性设置为true,这样窗体将在Vista上调整大小,并确保MonthCalendar的Dock属性设置为Dock.None。示例代码供您参考:public void onDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyif(Environment. OSVersion. Version. Major>= 6){this. Size = this.monthCalendar1.GetRedSize(new Size());}}个文件夹请试试我的建议,让我知道它是否对你有意义。如果您有任何问题或疑虑,请不要犹豫,让我知道。最好的问候,Zhi-Xin Ye微软托管新闻组支持团队似乎有一种方法是专门针对这个问题设计的:
this.monthCalendar1.GetPreferredSize(new Size());
然而,我在多台机器上测试了这种方法,并且给予您178 px的首选宽度,无论主题或操作系统如何。(就我所测试的而言)。!?所以,受够了,我只是要给给予日历178的宽度,并计划购买商业控制或类似的东西。感谢所有的帮助...
dgsult0t4#
我的应用正在使用Application.EnableVisualStyles();我禁用了日历的视觉样式中的JumeHandle()方法:
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
4条答案
按热度按时间xam8gpfp1#
这是预期的行为。如果你不想受主题的影响,完全禁用主题(即。不要执行命令
Application.EnableVisualStyles();
)。否则,不同的主题总是会产生不同的控件外观(因为它们本来就是这样做的)。如果你想在任何时候都适合控件,使用一个更流畅的布局,利用锚点和对接。iyr7buue2#
我遇到了同样的问题,找到了一个解决方案:
看起来
MonthCalendar
控件的尺寸在运行时显示(如表单)时会正确更新。例如,使用表单的
Shown
事件来了解维度何时更新。还可以将窗体的
AutoSize
属性设置为true
,将AutoSizeMode
设置为GrowAndShrink
,以使窗体自动适应MonthCalendar
控件。更新:
有关更多详细信息,请尝试以下示例:
将MonthCalendar控件放在这样的窗体上:
在表单的Shown事件中添加以下内容:
当程序运行时,您将看到一个消息框,显示正确的尺寸。宽度和高度也被放入两个变量中,你可以在程序中的任何地方使用(我知道,这是一种快速而肮脏的方式;- )当然,如果你不想要的话,你可以省略消息框。
要检查它是否真的工作,请尝试更改Windows中的区域设置:将格式更改为例如丹麦语。再次运行程序,你会看到宽度变小了,因为丹麦日历控件变小了。
关于
AutoSize
和AutoSizeMode
属性,它们可用于使窗体的大小适应MonthCalender控件的大小。这样做:将表单中的两个属性更改为:现在运行该程序,您将看到表单的大小根据MonthCalender控件的大小自动更改:
就是这样!(记得将您的区域格式设置切换回原始格式)
bq8i3lrv3#
我发现了这个
http://www.eggheadcafe.com/software/aspnet/34174436/vista-monthcalendar-control.aspx
欢迎再次来到微软管理新闻组,我是叶志新,很高兴能和大家一起讨论这个问题。
MonthCalendar控件由操作系统呈现,因此在XP和Vista之间呈现不同。您可以使用Environment. OSVersion. Version. Major属性来确定OS版本,并调用MontheCalendar. GetErrorRedSize()方法来检索Vista上的首选大小,以便您可以通过编程方式更改窗体的大小,使其适合MonthCalendar。同时,将窗体的AutoSize属性设置为true,这样窗体将在Vista上调整大小,并确保MonthCalendar的Dock属性设置为Dock.None。
示例代码供您参考:
public void onDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroyOnDestroy
if(Environment. OSVersion. Version. Major>= 6){this. Size = this.monthCalendar1.GetRedSize(new Size());}}个文件夹
请试试我的建议,让我知道它是否对你有意义。如果您有任何问题或疑虑,请不要犹豫,让我知道。
最好的问候,Zhi-Xin Ye微软托管新闻组支持团队
似乎有一种方法是专门针对这个问题设计的:
然而,我在多台机器上测试了这种方法,并且给予您178 px的首选宽度,无论主题或操作系统如何。(就我所测试的而言)。!?
所以,受够了,我只是要给给予日历178的宽度,并计划购买商业控制或类似的东西。感谢所有的帮助...
dgsult0t4#
我的应用正在使用Application.EnableVisualStyles();我禁用了日历的视觉样式中的JumeHandle()方法:
检查日历控件源:http://referencesource.microsoft.com/#System.Windows.Forms/ndp/fx/src/winforms/Managed/System/WinForms/MonthCalendar.cs