Надстройка Word VSTO: Как установить ширину настраиваемой области задач? - PullRequest
0 голосов
/ 22 мая 2018

Я разработал объект UserControl для реализации пользовательского интерфейса для моей надстройки Word.Во время выполнения, когда пользователь открывает панель задач, я добавляю экземпляр этого UserControl в активное окно (через коллекцию CustomTaskPanes), устанавливаю для его свойства Visible значение true, и вот, я получаю свою панель задач ...кроме того, что оно усечено, я вижу только левые 70%, и мне нужно вручную изменить размер панели задач, чтобы увидеть UserControl в полном объеме.

Во-первых, я не понимаю, почему поведение по умолчаниюпанели задач не было бы просто взять расчетный размер того, что я положил в него.Но все становится еще хуже.

Следующим моим логическим шагом было явное задание ширины области задач равной ширине моего UserControl.Поскольку конструктор Windows Forms показал, что его свойство Size равно «700, 1500», я глупо подумал, что смогу прочитать это свойство во время выполнения и назначить его ширине панели задач.Код выглядит следующим образом:

var myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(myUserControl, title);
myTaskPane.Visible = true;
myTaskPane.Width = myUserControl.Width;

Это неожиданно завершилось неудачно, поскольку оказывается, что во время выполнения myUserControl.Width равно нулю.Все, что я получаю, это очень узкая область задач, которая показывает только оставшиеся 20% моего UserControl.Я также попытался назначить myUserControl.Size.Width с тем же результатом.

Поэтому я сохранил свой проект в облаке и вернулся к нему на следующий день, на другом компьютере, с другимдисплей (4K).К моему удивлению, когда я открыл конструктор Windows Forms, размер UserControl теперь отображался как «432, 1200».Но все выглядело точно так же.

Если я присваиваю немедленное значение myTaskPane.Width, , что работает просто отлично.Если это значение соответствует ширине, сообщенной конструктором Windows Forms, область задач точно соответствует ширине, необходимой для отображения UserControl.За исключением того, что я не в порядке с жесткими параметрами проектирования.Кроме того, какое значение я бы выбрал?700 или 432?Конечно, панель задач на некоторых системах выглядела бы неправильно.

Итак, у меня есть два вопроса: как точно работают размеры UserControl?И где я могу прочитать ширину UserControl во время выполнения?

Хуже всего то, что это кажется чем-то настолько фундаментальным, что должно иметь простое решение, но я просто не могу Google выйти из этого.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это своего рода тангенциальный ответ, но для надстроек на уровне документа настройка ширины должна выполняться другим способом.

CommandBars["Task Pane"].Width = <your value here>;

Я вытащил отсюда .

0 голосов
/ 22 мая 2018

РЕДАКТИРОВАТЬ: Я думал, что у меня есть решение, но оказывается, что на самом деле это обходной путь, основанный на пользовательском методе, который я реализовал некоторое время назад.Это говорит о том, что если вы будете придерживаться надлежащих соглашений об именах и повторно использовать свой код, в конечном итоге вы можете в конечном итоге думать, что ваши собственные методы являются частью .NET.Продолжайте читать, однако, я исправил свой ответ.

У меня была мозговая волна ... моя ошибка заключалась в том, что свойства элемента управления, доступные через редактор Windows Forms в Visual Studio, также будут доступны длямой код во время выполнения.Я все еще не знаю, почему это не так, и что происходит со значениями, которые отображаются в редакторе, но я догадался, что может быть метод до безумия (игра в каламбур).

IntelliSense пришел мне на помощь, и теперь мой код выглядит так:

var myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(myUserControl, title);
myTaskPane.Visible = true;
myTaskPane.Width = myUserControl.GetActualWidth(); 

И это работает.Моя область задач теперь точно соответствует ширине, необходимой для отображения пользовательского элемента управления, который я поместил в нее.

Исправление: это потому, что я сам недавно кодировал «GetActualWidth ()».Он работает, считывая ширину самого большого элемента управления в моем UserControl и добавляя к нему поля.Я забыл, что закодировал его и отклонил за то, что он не элегантен.Вы будете не иметь этот метод GetActualWidth () в вашем UserControl, если только вы его не внедрили.

Итак, остаются некоторые вопросы: почему тот же проект, открытый наVisual Studio, но на двух разных компьютерах, показать разные значения ширины UserControl в редакторе Windows Forms?Это как-то связано с масштабированием DPI?Есть ли документация по этому поводу?Почему панель задач не может просто отображать 100% ее содержимого по умолчанию?

Теперь возникает дополнительный вопрос: почему я могу прочитать ширину элемента управления в моем UserControl и получить его расчетное значение, но я не могу сделать то же самое с самим UserControl?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...