Laden...

[erledigt] Event ContextMenu.ContextMenuOpening wird nicht gefeuert

Erstellt von Michael Hößel vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.499 Views
M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 4 Jahren
[erledigt] Event ContextMenu.ContextMenuOpening wird nicht gefeuert

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.

16.807 Beiträge seit 2008
vor 4 Jahren

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?

M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 4 Jahren

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.

M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 4 Jahren

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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).

M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 4 Jahren

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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.