Das Add-In besteht aus mehreren Schaltflächen im Menüband und mehreren Aufgabenbereichen, die sichtbar oder ausgeblendet werden können.
Mein Problem ähnelt diesem Beitrag, auf den es keine Antworten gibt: Anzeigeproblem im benutzerdefinierten Aufgabenbereich des Office-Add-Ins, aber ich habe hier mehr Kontext.
Die Steuerelemente im benutzerdefinierten Aufgabenbereich werden mit WPF entworfen und Einbindung in einen ElementHost, der einem WinForm-Steuerelement hinzugefügt wird Kinder. Dieses WinForm-Steuerelement wird der CustomTaskPanes-Eigenschaft der ThisAddIn-Klasse hinzugefügt.
Das WPF-Steuerelement enthält einen TextBlock und eine Combobox mit wenigen Elementen darin.
Soweit ich verstanden habe, ist dies die einzige Möglichkeit, WPF zu verwenden für die Aufgabenbereiche für Office.
Code: Select all
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);
}
}
Code: Select all
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;
}
Hier liegt nun mein Problem : Wenn in den Windows-Bildschirmeinstellungen der Bildschirmskalierungsparameter auf einen Wert über 100 % eingestellt ist, werden die Texte, Rahmen usw. sowohl der WPF-Dialoge als auch der Aufgabenbereiche unscharf:
Der Aufgabenbereich ist verschwommen
Fenster ist verschwommen
Beginnend mit dem Fenster habe ich kurz vor der Erstellung des Fensters SetThreadDpiAwarenessContext mit dem Parameter PerMonitorAware aufgerufen.
< pre class="lang-cs Prettyprint-override">
Code: Select all
public void OnButtonClicked(IRibbonControl control)
{
DpiHelper.SetThreadDpiAwareness(DpiAwarenessContext.PerMonitorAware);
new Window1().ShowDialog();
}
Animiertes GIF, das das Flackern meines Fensters zeigt
Dann habe ich während der Methode ThisAddIn.BeginInit() eine Instanz von System.Windows.Application erstellt und auch SetThreadDpiAwarenessContext aufgerufen, bevor:
Code: Select all
public override void BeginInit()
{
DpiHelper.SetThreadDpiAwareness(DpiAwarenessContext.PerMonitorAware);
_ = new Application
{
ShutdownMode = ShutdownMode.OnExplicitShutdown
};
}
Zu diesem Zeitpunkt erscheint der Aufgabenbereich immer noch verschwommen, aber das Verhalten der darin enthaltenen Combobox ist schlechter : Jetzt flackert die Liste der Elemente in der Combobox, und die Auswahl eines Elements ist wirklich schwierig!
Animiertes GIF, das das Flackern der Combobox zeigt
I habe mehrere Anrufkombinationen ausprobiert SetThreadDpiAwareness, wie das Tätigen eines Aufrufs kurz bevor der Aufgabenbereich zum ersten Mal sichtbar gemacht wird, oder im Konstruktor des WPF-Steuerelements, das im ElementHost gehostet wird, ohne Erfolg.
Ich habe auch versucht, was in erklärt wird diese Nachricht: https://stackoverflow.com/a/50252643/23786564. Es ist unklar, was ich tun soll, nachdem ich die WM_DPICHANGED-Nachricht eingehakt habe.
Das Flackern im Aufgabenbereich beginnt mit der Initialisierung von System.Windows.Application.
Das Flackern macht Das Klicken auf die Schaltflächen / Auswahl der Combobox-Elemente ist schwierig, da das Steuerelement tatsächlich den Fokus verliert oder der Mauszeiger-Auslöser wiederholt von „True“ auf „False“ wechselt.
Gibt es eine Möglichkeit, dies zu erreichen? was ich will, Bedeutet das, dass sowohl Fenster als auch gehostete WPF-Steuerelemente klar aussehen und kein Flackern beobachtet wird?
Das Problem ist mit einem minimalen Projekt reproduzierbar, das Sie auf Github finden können: https://github.com/GradlonGwen /PPT-VSTO-AddIn/tree/main/PowerPointAddIn1
BEARBEITEN:
Ich habe auch versucht, was in diesem alten Thread erklärt wird: VSTO WPF Outlook-Add-In – Probleme beim Aktualisieren eines ElementHost Enthält WPF-Inhalte nach der Größenänderung.
Aber leider hat das Erzwingen des WPF-Rendermodus auf „SoftwareOnly“ mein Problem nicht behoben.