Ширина месяца месяца на разных (платформах), исправление: темы (тема XP против Aero) - PullRequest
11 голосов
/ 24 мая 2011

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

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

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

Редактировать / Исправить:календарь выглядит по-разному в зависимости от выбранной темы:

enter image description here

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

Ответы [ 4 ]

3 голосов
/ 17 октября 2013

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

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

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

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

Обновление:

Для получения более подробной информации попробуйте следующий пример:

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

Form with MonthCalender control

В формуле Показано Событие добавьте это:

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

Относительно свойств AutoSize и AutoSizeMode они могут быть использованы для адаптации размера формы кразмер элемента управления MonthCalender.Сделайте это: Измените два свойства в форме на это:

Form's properties (Visual Studio)

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

Result

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

;-) Дейв

3 голосов
/ 26 мая 2011

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

0 голосов
/ 01 августа 2014

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

 ...

Проверьте источник управления Calendar в: http://referencesource.microsoft.com/#System.Windows.Forms/ndp/fx/src/winforms/Managed/System/WinForms/MonthCalendar.cs

0 голосов
/ 01 июня 2011

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

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 (new Size ());}}

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

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

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

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

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

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

...