Как получить четкое представление моего размещенного элемента управления WPF в настраиваемой области задач Office, когдаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как получить четкое представление моего размещенного элемента управления WPF в настраиваемой области задач Office, когда

Сообщение Anonymous »

Я разрабатываю надстройку VSTO для Microsoft Office, используя C# и WPF. В качестве платформы используется .NET framework 4.8.
Надстройка состоит из нескольких кнопок на ленте и нескольких панелей задач, которые можно видеть или скрывать.
Моя проблема аналогична этому сообщению, на которое нет ответов: Проблема с отображением настраиваемой панели задач надстройки 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;
}
Надстройка также может открыть новое окно WPF в виде модального диалогового окна с помощью кнопки на ленте.
Теперь вот моя проблема : в настройках экрана 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 и создать приложение в указанном порядке. Мне до сих пор неясно, зачем создавать новый System.Windows.Application.
На этом этапе панель задач все еще выглядит размытой, но поведение поля со списком внутри хуже. : теперь список элементов в комбобоксе мерцает, и выбрать один элемент действительно сложно!
Анимированная гифка, показывающая мерцание комбобокса
Я попробовал несколько комбинаций вызов 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»