Надстройка состоит из нескольких кнопок на ленте и нескольких панелей задач, которые можно видеть или скрывать.
Моя проблема аналогична этому сообщению, на которое нет ответов: Проблема с отображением настраиваемой панели задач надстройки Office, но у меня здесь больше контекста.
Элементы управления в настраиваемой панели задач разработаны с использованием WPF и включение в ElementHost, который добавляется в WinForm контролировать детей. Этот элемент управления WinForm добавляется в свойство CustomTaskPanes класса ThisAddIn.
Элемент управления WPF содержит TextBlock и Combobox с несколькими элементами.
Насколько я понял, это единственный способ использовать WPF для панелей задач Office.
Код: Выделить всё
public partial class TaskPaneWinForm : UserControl
{
public TaskPaneWinForm()
{
InitializeComponent();
var wpfHost = new ElementHost
{
Dock = DockStyle.Fill,
AutoSize = true,
Margin = new Padding(0)
};
wpfHost.Child = new HostedWpfTaskPane();
Controls.Add(wpfHost);
}
}
Код: Выделить всё
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
var taskPane = CustomTaskPanes.Add(new TaskPaneWinForm(), "Task pane");
taskPane.Width = 400;
taskPane.Visible = false; // will be set to true on a click to a button in the ribbon
_ribbon.TaskPane = taskPane;
}
Теперь вот моя проблема : в настройках экрана Windows, если для параметра «Масштабирование экрана» установлено значение выше 100 %, тексты, границы и т. д. как диалоговых окон WPF, так и панелей задач становятся размытыми:
Панель задач размыта
Окно размыто
Начиная с окна, перед его созданием я вызвал SetThreadDpiAwarenessContext с параметром PerMonitorAware.
< pre class="lang-cs Prettyprint-override">
Код: Выделить всё
public void OnButtonClicked(IRibbonControl control)
{
DpiHelper.SetThreadDpiAwareness(DpiAwarenessContext.PerMonitorAware);
new Window1().ShowDialog();
}
Анимированный gif, показывающий мерцание моего окна
Затем я создал экземпляр System.Windows.Application во время метода ThisAddIn.BeginInit(), а также перед этим вызвал SetThreadDpiAwarenessContext:
Код: Выделить всё
public override void BeginInit()
{
DpiHelper.SetThreadDpiAwareness(DpiAwarenessContext.PerMonitorAware);
_ = new Application
{
ShutdownMode = ShutdownMode.OnExplicitShutdown
};
}
На этом этапе панель задач все еще выглядит размытой, но поведение поля со списком внутри хуже. : теперь список элементов в комбобоксе мерцает, и выбрать один элемент действительно сложно!
Анимированная гифка, показывающая мерцание комбобокса
Я попробовал несколько комбинаций вызов SetThreadDpiAwareness, например вызов непосредственно перед тем, как панель задач становится видимой в первый раз, или в конструкторе элемента управления WPF, размещенном в ElementHost, безуспешно.
Я также попробовал то, что описано в этом сообщении: https://stackoverflow.com/a/50252643/23786564. Непонятно, что мне делать после того, как я перехватил сообщение WM_DPICHANGED.
Мерцание на панели задач начинается с инициализации System.Windows.Application.
Мерцание вызывает щелчок по кнопкам/выбор элементов поля со списком затруднителен, потому что элемент управления фактически теряет фокус, или триггер при наведении мыши постоянно переключается с true на false.
Есть ли способ добиться того, чего я хочу, то есть и окна, и размещенные элементы управления WPF выглядят четко, и мерцания не наблюдается?
Проблему можно воспроизвести с помощью минимального проекта, который можно найти на github: https ://github.com/GradlonGwen/PPT-VSTO-AddIn/tree/main/PowerPointAddIn1
Подробнее здесь: https://stackoverflow.com/questions/793 ... -task-pane