Laden...

Kontext Menü "ToolStripMenuItem" per links-Click anstatt mit rechts-Click aufrufen?

Erstellt von ToRi vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.319 Views
T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren
Kontext Menü "ToolStripMenuItem" per links-Click anstatt mit rechts-Click aufrufen?

Hallo zusammen

Bei einem Programm sollen so wenig verwirrende Buttons wie möglich erscheinen. Daher das Kontex Menü. nun suche ich nach einer einfachen Lösung um ein Kontext Menü das auf jeder Zeile in einer ListView per rechts-Click erscheint, so umzubauen, dass es erscheint, wenn die linke Maustaste gedrückt wird. Einfach weil das Programm über einen TouchScreen bedient wird, und keine Maus zur Verfügung steht. Wenn die Zeile also angetippt wird, würde das Kontext Menü erscheinen, da linke Maustaste. Oder gibt es dafür eine bessere Lösung ? Vielen Dank.

Hat da Jemand Erfahrung damit ?


private void Button1_Click(object sender, EventArgs e)
{
      listView1.FullRowSelect = true;
     
      listView1 item = new ListViewItem("1");
      item.SubItems.Add("");
      item.SubItems.Add("TestEintrag1");
      item.SubItems.Add("TestEintrag2");
      listView1.Items.Add(item);
}      

private void exitToolStripMenuItem_Click( object sender, EventArgs e )
{
      return;
}

private void removeToolStripMenuItem_Click( object sender, EventArgs e )
{
      if (listView1.Items.Count > 0)
          listView1.Items.Remove( listView1.SelectedItems[0] );             
}

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo ToRi,

normalerweise simuliert man Rechtsklicks auf dem Touchscreen mit dem "berühmten" 300ms-Delay. Tippt also der User mehr als 300ms auf ein Item ist das im Falle eines Touchscreens ein Rechtsklick.

Gruss

Coffeebean

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

Hallo Coffeebean,

Danke für die Antwort. Das habe ich nicht gewusst, dann würde es ja ohne weiteres funktionieren. Jetzt habe ich aber das Problem, dass dieser Display an einem Automaten hängt, und es ziemlich sicher ist, dass die Oma neben anderen Benutzern die den bedienen, das bestimmt nicht realisiert. Gibt es die Möglichkeit diese 300ms-Delay zu verkürzen ?

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo ToRi,

ich bin mir nicht sicher, ob das automatisch geht (glaube eher nicht. Vielleicht gibts aber was Fertiges. Ich bin kein WinForms-Profi und dein Code sieht mir nach WinForms aus). Wenn dus sowieso selbst machen musst, kannst du es natürlich verkürzen.

Gruss

Coffeebean

656 Beiträge seit 2008
vor 5 Jahren

Ich weiß, dass man ToolStripDropDownItems per ToolStripDropDownItem.ShowDropDown() aufklappen kann...nachdem das ToolStripMenuItem von dem ableitet würde ichs einfach mal ausprobieren (zb. in einem "Item Clicked" EventHandler oder so).

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

Habe mal einen TouchScreen angeschlossen und das getestet. In der listView lassen sich die Zeilen wie erwartet per Touch selectieren. Bleibe ich da mit dem Finger drauf, passiert allsrdings nix. muss man das noch zusätzlich einstellen oder freigeben? Habe nichts gefunden. Müsste ja nach 300ms auf Kontext-Menü umschalten, wenn ich das jetzt richtig verstanden habe.

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo ToRi,

muss man das noch zusätzlich einstellen oder freigeben? Habe nichts gefunden.

Bitte lies meinen letzten Beitrag. Um es noch deutlicher zu sagen: Es gibt keine Einstellung a la "EnableTouchScreenBehaviour", das setzt man und dann läufts.

Schau dich mal nach Bibliotheken um, eventuell gibts welche von Telerik für Windows Forms, ich weiss es nicht genau. Ich bin ziemlich sicher, dass du selber Hand anlegen musst. (Vielleicht weiss das aber ein WinForms-Profi hier im Forum besser 😃

Wir reden bei Touch ja auch von Gesten, von der Anzahl der Finger, die den Screen berühren und und und.

Die 300ms kenne ich vom Web & Mobile, die sind also völlig unabhängig jeder Technologie.

Gruss

Coffeebean

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

Hallo Coffeebean,

ok, vielen Dank. Werde weiter suchen.

Gruss

ToRi

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

@Coffeebean

Kannst ja die Lösung für den anderen Beitrag noch dazuschreiben, dann ist der nicht für die Katz.


for (int zahl = 0; zahl < listView1.Items.Count; ++zahl)                      
{                           
     text = "  " + listView1.Items[zahl].SubItems[0].Text; + listView1.Items[zahl].SubItems[2].Text;
     e.Graphics.DrawString(text, drawFontArial10Regular, drawBrush, new RectangleF(x, y, width, height), drawFormatLeft);
     y += e.Graphics.MeasureString(text, drawFontArial10Regular).Height;
}

5.658 Beiträge seit 2006
vor 5 Jahren

Hi ToRi,

das Problem, dass dieser Display an einem Automaten hängt, und es ziemlich sicher ist, dass die Oma neben anderen Benutzern die den bedienen, das bestimmt nicht realisiert.

Dann ist ein Kontextmenü das falsche Konzept für deinen Anwendungsfall. Du kannst nicht einfach die Paradigmen von Benutzeroberflächen mit Tastatur- und Mausbedienung auf Benutzeroberflächen für Touch-Screens übertragen, und dann erwarten, daß jeder Benutzer damit zurechtkommt.

Weeks of programming can save you hours of planning

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

Das wäre dann die Lösung für das Kontext-Menü per linker Maustaste:


private void listView1_MouseClick(object sender, MouseEventArgs e)
{
     if (e.Button == MouseButtons.Left)
     {
         if (listView1.FocusedItem.Bounds.Contains(e.Location))
         {
             contextMenuStrip1.Show(Cursor.Position);
         }                    
     }
}

T
ToRi Themenstarter:in
18 Beiträge seit 2018
vor 5 Jahren

Hi MrSparkle,

ja danke, kinderleichte intuitive Bedienbarkeit steht im Fokus. Daher sind auch etwas unkonventionelle Lösungsansätze gefragt. Diese Lösung ist doch sehr einfach und sexy!! Übrigens, die Andere auch 😁