2009-04-06 1 views
0

verwalten Ich habe eine kleine WPF-Anwendung, die eine Leinwand und ein Gitter hat. Ich habe einige benutzerdefinierte Benutzersteuerelemente auf dem Grid platziert. Jetzt möchte ich einige Mausereignisse auf ihnen erfassen. Als Folge eines Ereignisses möchte ich etwas zur Leinwand hinzufügen (oder modifizieren). Im Benutzersteuerelement haben Sie jedoch keinen Verweis auf den zugrunde liegenden Canvas. Erste Frage, gibt es eine Möglichkeit, diese Referenz zu bekommen, zum Beispiel wie getElementById (..) in JavaScript.WPF Events und Verweise auf Objekte, und wie sie

Auch ich weiß, dass Sie solche Hinweise vermeiden sollten, wenn Sie eine saubere Architektur wollen. In diesem Fall empfiehlt es sich, Ereignisse bei einem bestimmten Benutzersteuerelement abzufangen und dann etwas auf einem anderen Objekt aufzurufen.

Antwort

1

Sie haben Zugriff auf Canvas, Grid oder ein anderes Element in Ihrem Benutzersteuerelement. Der einfachste Weg, auf sie zuzugreifen, besteht darin, sicherzustellen, dass jeder einen Namen hat, der mit dem x: Name-Attribut erfolgt.

<Grid x:Name="myGrid"> 

Dann in Ihrem Usercontrol können Sie es mit myGrid zugreifen. Um von außerhalb des UserControl auf ein Grid zuzugreifen, müssten Sie in Ihrem Benutzersteuerelement eine Methode erstellen, mit der Sie es bearbeiten können.

Es gibt eine this.FindName-Methode, die Sie in einem UserControl verwenden können, das dem getElementById von JavaScript entspricht, aber Sie sollten es nicht verwenden müssen, da Sie direkt auf Objekte mit ihrem Namen zugreifen können.

+0

thx :) aber ich sah, dass es in wpf Routing-Ereignisse gibt .. Ich lese jetzt auf Routingereignisse .. – Nils

+0

Routingereignisse sind gut für das Holen von Ereignissen die Steuerungshierarchie durcheinander gebracht. Wenn Sie ein Steuerelement auf oberster Ebene oder ein Fenster haben, können Sie bestimmte Ereignisse zulassen, indem Sie sie nicht auf untergeordneten Steuerelementen behandeln. – sipwiz

1

WPF hat eine neue Event-Architektur, die Ihnen heraus hier helfen kann. Sogenannte „geroutet“ Ereignisse können entweder „Tunnel“ von den logischen Stammcontainern, durch alle Zwischenbehälter, an das Ereignisquellenelement oder „Blase“ aus dem Quellelement nach oben (dh „Tunneling“ und „sprudelndem“ -Ereignisse gegens propagieren Richtungen).

All das zu sagen, dass Sie in der Regel Ereignisse von untergeordneten Elementen abfangen können, indem Sie einen Ereignishandler im Container registrieren. Hier ist ein Beispiel für das Abfangen Schaltfläche klicken Ereignisse von Schaltflächen in einem Stackpanel:

<StackPanel ButtonBase.Click="HandleButtonClick"> 
    <Button>Foo</Button> 
    <Button>Bar</Button> 
</StackPanel> 

Und HandleButtonClick könnte wie folgt implementiert werden:

private void HandleButtonClick(object sender, RoutedEventArgs e) 
{ 
    var button = e.OriginalSource as Button; 
    if (button != null) MessageBox.Show(button.Content.ToString()); 
} 

Je nachdem, welche Art von „Custom Controls“ Sie verwenden, diese möglicherweise nicht möglich. Dies liegt daran, dass nicht alle Ereignisse "geroutet" sind. WPF-Steuerungsereignisse sind normalerweise Routing-Ereignisse.