MonthCalendar width на разных платформах, исправления: темы (XP vs Aero theme)

По-видимому,.NET monthcalendar отличается по-разному на разных платформах. Календарь на Vista шире, чем календарь XP.

Я хочу сделать календарь подходящим и точным на всех платформах. Есть ли способ сделать это, без необходимости измерять и жестко кодировать разные ширины?

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

Изменить/Исправить: Кажется, что календарь отличается от выбранной вами темы:

enter image description here

Как компенсировать это?

Ответ 1

Это ожидаемое поведение. Если вы не хотите, чтобы их выполняли по темам, полностью отключите их (т.е. Не выполните команду Application.EnableVisualStyles();). В противном случае разные темы всегда будут давать разные взгляды на элементы управления (как они должны делать). Если вы хотите постоянно вставлять элементы управления, используйте более плавный макет, используя якоря и стыковку.

Ответ 2

У меня была та же проблема и нашлось обходное решение:

Кажется, что размеры элемента управления MonthCalendar обновляются корректно, когда он отображается (как в форме) во время выполнения.

Используйте, например, событие Shown, чтобы узнать, когда размеры обновляются.

Вы также можете установить для свойства формы AutoSize значение true и AutoSizeMode на GrowAndShrink, чтобы форма автоматически соответствовала элементу управления MonthCalendar.

Update:

Подробнее читайте в этом примере:

Поместите элемент управления MonthCalendar в форму, подобную этой:

Form with MonthCalender control

В событии формы 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: измените формат на, например. Датский. Запустите программу еще раз, и вы увидите, что ширина стала меньше, потому что элемент управления датского месяцаCalender меньше.

Что касается свойств AutoSize и AutoSizeMode, их можно использовать, чтобы размер формы был адаптирован к размеру элемента управления MonthCalender. Сделай это: Измените два свойства в форме на это:

Form's properties (Visual Studio)

Теперь запустите программу, и вы увидите, что размер формы изменяется автоматически в зависимости от размера элемента управления MonthCalender:

Result

Что это! (не забудьте переключить настройку формата региона на исходный)

;-) Дейв

Ответ 3

Ну, я нашел это:

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

Добро пожаловать в Microsoft Manage Newsgroup снова, я Zhi-Xin Ye, это мой удовольствие работать с вами по этой проблеме.

Элемент управления MonthCalendar отображается ОС и, следовательно, отображается между XP и Vista. Вы можете использовать Environment.OSVersion.Version.Major для определения версии ОС, и вызовите метод MontheCalendar.GetPreferredSize() для извлечения предпочтительного размер на Vista, так что вы можете программным образом изменить размер формы чтобы он соответствовал месячному календарю. Между тем, включите свойство AutoSize формы в true, чтобы форма изменилась на Vista, и убедитесь, что свойство Dock для MonthCalendar установлено на Dock.None.

Пример кода для вашей информации:

private void Form1_Load (отправитель объекта, EventArgs e) {

if (Environment.OSVersion.Version.Major >= 6) { this.Size = this.monthCalendar1.GetPreferredSize(новый Размер()); } }

Пожалуйста, попробуйте мое предложение и сообщите мне, имеет ли это значение для вас. Если у вас есть какие-либо вопросы или замечания, пожалуйста, не стесняйтесь, дайте мне знать.

С наилучшими пожеланиями, Чжи-Синь Е. Группа поддержки управляемых групп новостей Microsoft

Кажется, что метод специально разработан для этой проблемы:

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

Однако я протестировал этот метод на нескольких машинах и предоставил вам всегда предпочтительную ширину 178 px независимо от темы или ОС. (Насколько я проверял).!?

Итак, будучи сыты по горло, я просто дам календарь шириной 178 и планирую купить коммерческий контроль или что-то подобное. Спасибо за помощь...

Ответ 4

Мое приложение использует 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