Wie erhalte ich eine klare Darstellung meines von WPF gehosteten Steuerelements in einem benutzerdefinierten Office-AufgC#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie erhalte ich eine klare Darstellung meines von WPF gehosteten Steuerelements in einem benutzerdefinierten Office-Aufg

Post by Guest »

Ich entwickle ein VSTO-Add-In für Microsoft Office mit C# und WPF. Das Framework ist .NET Framework 4.8.
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;
}
Das Add-In kann über eine Schaltfläche im Menüband auch ein neues WPF-Fenster als modales Dialogfeld öffnen.
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();
}
Mit diesem Code erscheint das Fenster klar und überhaupt nicht verschwommen. Allerdings flackert die Schaltfläche, wenn sich die Maus in der Nähe des unteren und rechten Rands bewegt, was das Klicken nahezu unmöglich macht.
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
};
}
Dadurch wird mein Fenster repariert: Der Text ist nicht mehr verschwommen und die Schaltflächen flackern nicht mehr. Beachten Sie, dass ich beides tun musste, nämlich SetThreadDpiAwareness aufrufen und die Anwendung erstellen, und zwar in dieser Reihenfolge. Mir ist immer noch unklar, warum eine neue System.Windows.Application erstellt werden muss.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post