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

lhcgjxsq  于 2023-10-23  发布在  其他
关注(0)|答案(4)|浏览(155)

显然.NET月历在不同的平台上呈现不同。Vista上的日历比XP上的日历宽。
我想让日历在所有平台上都能很好地匹配和精确。有没有一种方法可以做到这一点,而不必测量和硬编码不同的宽度?
..............
编辑/更正:日历似乎会根据您选择的主题以不同的方式呈现:

如何弥补这一点?

xam8gpfp

xam8gpfp1#

这是预期的行为。如果你不想受主题的影响,完全禁用主题(即。不要执行命令Application.EnableVisualStyles();)。否则,不同的主题总是会产生不同的控件外观(因为它们本来就是这样做的)。如果你想在任何时候都适合控件,使用一个更流畅的布局,利用锚点和对接。

iyr7buue

iyr7buue2#

我遇到了同样的问题,找到了一个解决方案:
看起来MonthCalendar控件的尺寸在运行时显示(如表单)时会正确更新。
例如,使用表单的Shown事件来了解维度何时更新。
还可以将窗体的AutoSize属性设置为true,将AutoSizeMode设置为GrowAndShrink,以使窗体自动适应MonthCalendar控件。
更新:
有关更多详细信息,请尝试以下示例:
将MonthCalendar控件放在这样的窗体上:

表单的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中的区域设置:将格式更改为例如丹麦语。再次运行程序,你会看到宽度变小了,因为丹麦日历控件变小了。
关于AutoSizeAutoSizeMode属性,它们可用于使窗体的大小适应MonthCalender控件的大小。这样做:将表单中的两个属性更改为:

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

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

bq8i3lrv

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微软托管新闻组支持团队
似乎有一种方法是专门针对这个问题设计的:

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

然而,我在多台机器上测试了这种方法,并且给予您178 px的首选宽度,无论主题或操作系统如何。(就我所测试的而言)。!?
所以,受够了,我只是要给给予日历178的宽度,并计划购买商业控制或类似的东西。感谢所有的帮助...

dgsult0t

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

相关问题