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