Ich möchte für die Rechtschreibkorrektur ein System.Windows.Controls.RichtextBox in Windows.Forms einbinden.
Um Schriften und Farben zu ändern habe ich in eine eigen Klasse von System.Windows.Controls.RichTextBox abgeleitet:
public partial class BOPLibFormsRichTextBox : System.Windows.Controls.RichTextBox
{
private System.Windows.Forms.FontDialog fD;
private System.Windows.Forms.ColorDialog cD;
private System.Windows.Forms.Form pF;
public BOPLibFormsRichTextBox() : base()
{
this.ContextMenu = new ContextMenu();// getContextMenu();
this.ContextMenu.ContextMenuOpening += ContextMenu_ContextMenuOpening;
}
private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
throw new NotImplementedException();
}
private ContextMenu getContextMenu()
{
ContextMenu result = new ContextMenu();
result.ContextMenuOpening += Result_ContextMenuOpening;
//Can create STATIC custom menu items if exists here...
MenuItem mi0 = new MenuItem(); mi0.Header = "Alles _Markieren"; mi0.Tag = 0; mi0.Click += mi_Click; result.Items.Add(mi0);
MenuItem mi1 = new MenuItem(); mi1.Header = "_Standardschrift"; mi1.Tag = 1; mi1.Click += mi_Click; result.Items.Add(mi1);
MenuItem mi2 = new MenuItem(); mi2.Header = "Schriftart _Wählen"; mi2.Tag = 2; mi2.Click += mi_Click; result.Items.Add(mi2);
MenuItem mi3 = new MenuItem(); mi3.Header = "_Farbe wählen"; mi3.Tag = 3; mi3.Click += mi_Click; result.Items.Add(mi3);
MenuItem mi4 = new MenuItem(); mi4.Header = "_Ausschneiden"; mi4.Tag = 4; mi4.Click += mi_Click; result.Items.Add(mi4);
MenuItem mi5 = new MenuItem(); mi5.Header = "_Kopieren"; mi5.Tag = 5; mi5.Click += mi_Click; result.Items.Add(mi5);
MenuItem mi6 = new MenuItem(); mi6.Header = "_Einfügen"; mi6.Tag = 6; mi6.Click += mi_Click; result.Items.Add(mi6);
MenuItem mi7 = new MenuItem(); mi7.Header = "_Löschen"; mi7.Tag = 7; mi7.Click += mi_Click; result.Items.Add(mi7);
MenuItem mi8 = new MenuItem(); mi8.Header = "S_uchen"; mi8.Tag = 8; mi8.Click += mi_Click; result.Items.Add(mi8);
return result;
}
private void mi_Click(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
}
Eingebunden ist diese Control wie folgt:
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
var host = new System.Windows.Forms.Integration.ElementHost();
host.Dock = DockStyle.None;
host.Location = new Point(20, 20);
host.Size = new Size(300, 60);
var rtb = new BORGAPAK.BOPLibFormsRichTextBox();
rtb.SpellCheck.IsEnabled = true;
host.Child = rtb;
this.Controls.Add(host);
rtb.Selection.Text = "Dies ist ein Test";
}
}
Die Click-Events für die Einträge in ContextMenu funktionieren. Das ContextMenuOpening-Event wird ignoriert.
Definiere ich kein eigenes ContextMenu funktioniert die Rechtschreibprüfung. Definiere ich eine eigenes ContextMenu funktioniert nur dieses, logisch. Um beides zu kombinieren wie hier
https://docs.microsoft.com/de-de/dotnet/framework/wpf/controls/how-to-use-spell-checking-with-a-context-menu beschrieben muss ich mein ContextMenu ergänzen und brauche dafür das Event.
Was mache ich falsch?
Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.
Du hast im WPF Forum das Thema erstellt (ich habs in Forms verschoben), sprichst im Beitrag von Windows Forms und verweist auf eine Dokumentation von WPF.
Ist diese Mischung mit Absicht?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ja, das war Absicht "ContextMenu.ContextMenuOpening" als Suchbegriff ergab genau 4 Antworten. Alle Probleme wurden in "GUI: WPF und XAML" behandelt. Ich vermute meinen Fehler bei der Realisierung ohne XAML. Das im Link genannte Beispiel wurde mit XAML erstellt. Ich suche die Ursache gerade in den "Routed Events". Diese gibt es auch nur in der WPF.
Es kann natürlich auch am Zusammenspiel dieser beiden Technologien liegen.
Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.
Ergänzung: Ich habe von "System.Windows.Controls.RichTextBox" aus der WPF und nicht aus
"System.Windows.Forms.RichTextBox" aus dem .NET Framework geerebt.
Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.
Ich denke, das liegt daran, daß du eben kein WPF-Window sondern eine WinForms-Form als Fenster benutzt, so daß nur eine WinForms-Nachricht abgeschickt wird.
Überprüfe mal, ob du die rechte Maustaste mittels MouseRightButtonUp abfragen kannst?
Wenn das klappt, dann müßtest du evtl. zusätzlich noch dasselbe für die Kontextmenü-Taste abfragen (falls du auch Tastatur unterstützen möchtest).
Hallo Th69,
vielen Dank. Nach dem ich festgestellt hatte, das
this.MouseRightButtonUp
genauso funktioniert wie
this.ContextMenu.MouseRightButtonUp
begann es zwischen den Ohren zu leuchten. Es durfte nicht
this.ContextMenu.ContextMenuOpening
(was sich ja auf das Kontextmenue des Kontextmenues bezieht)
sonder muss natürlich als
this.ContextMenuOpening
resgistriert werden.
Damit ist Alles gut und dieses Problem (3 Tage schäm) ist gelöst!
Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.
Ups, das hätte mir aber auch auffallen können, als ich mir deinen Code angesehen hatte, daß du für das falsche Objekt das Ereignis abonniert hast.