为啥 MonthCalendar 在 3rd 方应用程序中看起来不同?

Posted

技术标签:

【中文标题】为啥 MonthCalendar 在 3rd 方应用程序中看起来不同?【英文标题】:Why does MonthCalendar look different in 3rd party app?为什么 MonthCalendar 在 3rd 方应用程序中看起来不同? 【发布时间】:2011-01-19 17:39:37 【问题描述】:

我目前正在为第 3 方应用程序开发插件 dll。我的 dll 的一部分包括一个弹出窗口,其中包含 System.Windows.Forms.MonthCalendar。现在,当我在 Visual Studio 中处理它并使用我编写的测试应用程序打开弹出窗口时,它看起来是一种方式,但是当第 3 方应用程序打开它时,它看起来就不同了。除了看起来不同之外,他们还有不同的行为。有谁知道为什么?我认为可能是一个问题的一件事是我的 dll 是用 .Net 3.5 构建的,而第 3 方应用程序是 .Net 2.0(我认为)。但是当我将我的测试应用程序构建为 .Net 2.0 时,它仍然以相同的方式工作。

这就是我所期待的:

这就是我得到的:

【问题讨论】:

【参考方案1】:

第 3 方应用程序未启用视觉样式,因此转而使用经典的 Windows UI 主题。请注意,按钮和组合框看起来也不一样。您必须在第 3 方应用程序中启用视觉样式才能将当前的 Windows 主题应用到它。

(作为练习,尝试将您的 Windows 首选项切换为使用经典主题,然后查看正在运行的测试应用程序 - 它应该与第 3 方应用程序相同。)

【讨论】:

那么当从 3rd 方应用程序调用时,有没有办法强制我的弹出窗口使用经典的 Windows UI 主题? 可能,但我不会强求。您的控件的设计应使其在给定任何特定 UI 主题的情况下都能正常工作。您似乎已将其设计为仅适用于 Vista/7 主题。考虑使用自动调整大小的表格布局而不是 X、Y 布局,并使用尽可能多的主题进行测试(在合理范围内)。 是的,从我的测试应用程序中删除 Application.EnableVisualStyles() 确实会产生与第 3 方应用程序相同的结果。现在看看我是否可以为 3rd 方应用打开它。 你可以试试。但重申一下我的观点:如果控件依赖于要启用的特定 UI 主题,那么 该控件将被破坏。 老实说,我并不关心控件的“外观”,但我确实关心似乎会随着主题而改变的功能。而且我不想显示最小/最大日期范围之外的日期。

以上是关于为啥 MonthCalendar 在 3rd 方应用程序中看起来不同?的主要内容,如果未能解决你的问题,请参考以下文章

同步 MonthCalendar 和 Datetimepicker

如何使 MonthCalendar 在放大时仅显示单个月份? [复制]

带有嵌入式 MonthCalendar 问题的 UserControl

如何应用VB.NET MonthCalendar控件

Windows 7 中的 MonthCalendar 不同

MonthCalendar 无法禁用日期