2012-03-24 31 views
1

Warum kann ich das in WPF tun?Hinzufügen von Inhalt zu einer Schaltfläche klicken in wpf

button1Click.Content = "Hover over me"; 

oder

ToolTip t = new ToolTip(); 
    t.Content = "Something helpful"; 
    button1Click.Tooltip = t; 

ich bevölkern meine Witwe mit Bestücken-Tasten auf der Initialisierung ich dann eine foreach-Schleife, die Tasten wie so fügt hinzu:

 foreach (var routedEventHandler in new RoutedEventHandler[] { button1Click, button2Click, button3_Click })` 

Jetzt Arten I in diesem Bereich anwenden zu den Tasten alles in einem gehen wie folgt:

public void populateButtons() 
     { 
      double xPos; 
      double yPos; 


      Random ranNum = new Random(); 
      foreach (var routedEventHandler in new RoutedEventHandler[] { button1Click, button2Click, button3_Click }) 
      { 

       Button foo = new Button(); 



       Style buttonStyle = Window.Resources["CurvedButton"] as Style; 
       int sizeValue = 100; 

       foo.Width = sizeValue; 
       foo.Height = sizeValue; 

       xPos = ranNum.Next(200); 
       yPos = ranNum.Next(250); 


       foo.HorizontalAlignment = HorizontalAlignment.Left; 
       foo.VerticalAlignment = VerticalAlignment.Top; 
       foo.Margin = new Thickness(xPos, yPos, 0, 0); 
       foo.Style = buttonStyle; 

       foo.Click += routedEventHandler; 

       LayoutRoot.Children.Add(foo); 
      } 
     } 
    } 
} 
Aber

wenn ich versuche, dies:

private void button3_Click(object sender, RoutedEventArgs e) 
    { 
     ((Button)sender).ToolTip = t; 
    } 

Es wird nur aktiviert, wenn eine Taste gedrückt wird? (Danke @ H.B)

Jedoch, wenn ich den Tooltip Code in meinem bevöl Schaltflächen einfügen:

 Random ranNum = new Random(); 
     foreach (var routedEventHandler in new RoutedEventHandler[] { button1Click, button2Click, button3_Click }) 
     { 

      Button foo = new Button(); 
      ToolTip t = new ToolTip(); 
      t.Content = "Something helpful"; 
      foo.ToolTip = t; 

Es funktioniert? Aber das Problem ist, dass alle Schaltflächen mit dem gleichen Tooltip und/oder Button-Inhalt gesetzt werden! was ich nicht will, aber ich kann einen Weg nicht finden?

Also zusammenfassen kann ich entweder alle Schaltflächen mit der gleichen Tooltip-Nachricht oder Schaltfläche Inhalt innerhalb "populateButtons()" oder ich kann Tooltips und Button Inhalt nur einstellen, wenn die Taste gedrückt wurde.

Gibt es keine Methode, die Inhalte zu einer benannten Schaltfläche hinzufügen kann?

Wie mein ersten Versuch:

button1Click.Content = "Home Button"; 

oder

button1Click.ToolTip = "Hover over me"; 

Warum auf der Erde kippen Sie Inhalte und Tooltips für bestimmte Tasten auf der Initialisierung eingestellt?

+0

Warum in die Welt würde man über eine Sammlung von Handlern wie diese iterieren, frage ich mich ... –

+0

http://stackoverflow.com/questions/9843718/randomly-assigned-buttons können Sie den Grund hier finden @HB –

Antwort

1

Wenn Sie diesen Weg gehen wollen, dann können Sie einen Handler für Loaded-Ereignis hinzu:

foo.Click += routedEventHandler; 
foo.Loaded += routedEventHandler; 

Und dann haben Sie so etwas wie:

void button2Click(object sender, RoutedEventArgs e) 
    { 
     if (e.RoutedEvent == FrameworkElement.LoadedEvent) 
     { 
      ToolTip t = new ToolTip(); 
      t.Content = "Something helpful"; 
      ((Button)sender).ToolTip = t; 
      return; 
     } 
     //Logic for handling button clicks goes here 
     MessageBox.Show("action 2"); 
    } 
+0

Wenn Sie dies tun, werden alle Schaltflächen sofort beim Laden gefeuert, was bedeutet, wenn ich eine Nachricht an alle oder einige oder sogar nur eine hinzufügen alle Schaltflächen mit der Messagebox werden beim Laden des Formulars gefeuert. –

+1

Ja, Sie überladen den Event-Handler. Nicht ideal, aber macht den Job. Ich habe den Code aktualisiert –

+0

Erstaunlich! Es klappt! –

1

Sie ordnen die QuickInfo nicht im Handler zu. Wie sollte also etwas passieren?

((Button)sender).ToolTip = t; 
+0

Dies nur funktioniert, wenn man gedrückt wurde? –

+0

@KirstyWhite: Ja, so? Was willst du? Ihre Frage ist ziemlich vage ... –

+0

Ich habe meine Frage aktualisiert, dies könnte für mehr Klarheit sorgen. Als ich es gelesen hatte, wurde mir klar, dass es nur Sinn für mich machte. –

0

Wenn ich das richtig verstanden, Sie verschiedene „Typen“ von Tasten, die jeweils mit einem anderen Click-Handler und ein anderes Tooltip haben wollen.

Wenn das der Fall ist, könnten Sie verschiedene Klassen erstellen, die von Button abgeleitet sind (z. B. HilfreicheButtons, UnhelpfulButton ... wählen Sie bitte gute Namen :)) und in ihrem Konstruktor den Handler und den Tooltip zuweisen.

Dann könnten Sie im Hauptcode die verschiedenen Klassen durchlaufen und Instanzen von ihnen direkt zum Hauptbereich hinzufügen.

Eine andere mögliche Option besteht darin, verschiedene "Schablonen" -Schaltflächen mithilfe von Befehlen zu erstellen und die Eigenschaften von ihnen zu kopieren, anstatt die Schaltfläche "Unterklasse" zu erstellen.Etwas wie folgt aus:

Button helpfulTemplate = new Button { ToolTip = "blah" }; 
helpfulTemplate.Command = HelpfulCommand; 

Button unhelpfulTemplate = new Button { ToolTip = "bloh" }; 
unhelpfulTemplate.Command = UnhelpfulCommand; 

foreach(var template in new Button[] {helpfulTemplate, unhelpfulTemplate}) 
{ 
    var newCopy = new Button(); 
    //etc. 
    newCopy.ToolTip = template.ToolTip; 
    newCopy.Command = template.Command; 
} 
+0

Die Art, wie ich es in meiner Foreach zufällig erstellt und 3 Tasten auf dem Hauptformular erstellt, alles, was ich tun möchte, ist erstellen benutzerdefinierte Tooltips und Tastennamen für sie. Diese Methode hält mich an, diese drei Knöpfe zu nennen, weil sie jetzt nicht benannt werden und der Befehl noch generalisiert auf den Knöpfen nicht spezifisch ist, also Knopf 1 kann hallo auf ihm nicht sagen, ohne den Rest der Knöpfe hallo zu sagen. ALS kann ich die Methodengruppe nicht in ICommand konvertieren? –

Verwandte Themen