2010-12-04 5 views
3

GrüßeWPF - Canvas_MouseLeftButtonDown Ereignis

Ich begann gestern mit WPF zu entwickeln und haben in einige Fragen laufen. Ich kam zu dem Verständnis, dass ein Canvas einem Panel in WinForms gleichkam. Allerdings habe ich Schwierigkeiten mit dem "Klick" -Event. Das MouseLeftButtonDown-Ereignis. Wenn es relevant ist oder nicht, das Bild und die Leinwände sind in einem Usercontrol

Image + 3 Canvasses

Das obige Bild ist im Grunde, was ich Schwierigkeiten habe mit. Die 3 Bilder, die Sie sehen, sind ein Bild. Die Quadrate, die du siehst, sind jeweils unterschiedliche Leinwände. Je nachdem, auf welche Leinwand geklickt wird, möchte ich, dass etwas anderes passiert.

Zur Zeit habe ich den folgenden Code:

<Grid> 
    <Canvas Name="canvasTerran" Height="27" Width="26" Margin="88,106,134,106" MouseLeftButtonDown="canvasTerran_MouseLeftButtonDown" /> 
    <Canvas Name="canvasZerg" Height="27" Width="26" Margin="117,107,105,107" MouseLeftButtonDown="canvasZerg_MouseLeftButtonDown" /> 
    <Canvas Name="canvasProtoss" Height="27" Margin="145,107,88,107" MouseLeftButtonDown="canvasProtoss_MouseLeftButtonDown" /> 
    <Image Name="imageRaces" Height="27" Width="73" Stretch="Fill" Source="pack://application:,,,/Images/Races/Races.png" /> 
</Grid> 

Wenn ich die Anwendung ausführen (die Steuer Benutzer im Hauptfenster ist natürlich) und ich auf, wo die Leinwände sollen nichts passiert sein. Die Veranstaltung ich versuche zu Feuer:

private void canvasTerran_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      MessageBox.Show("lolterran", "lol"); 

      // image on main window 
      // .Source = new BitmapImage(new Uri("pack://application:,,,/" + Constants.RACESPATH + "T.png")); 
     } 

ich nicht wirklich sehen, was ich falsch mache hier so irgendwelche Vorschläge wäre willkommen. Wie gesagt, ich bin neu bei WPF, also wenn du denkst, dass es einen besseren Weg gibt, als ich es momentan versuche, sag es bitte!

Vielen Dank im Voraus.

Antwort

4

Das eigentliche Problem ist, dass die Leinwände transparent sind. Daher bleiben alle Ereignisse nicht auf der Arbeitsfläche stehen, sondern sie werden für das übergeordnete Element generiert.

Wenn Sie beispielsweise Hintergrund = Weiß oder Rot für eine Leinwand festlegen, sollte MouseLeftButtonDown angezeigt werden.

+1

Ja, aber Background = "Transparent" macht es auch! Anstatt es einfach Standard zu lassen. Danke für Ihre Antwort! – Citroenfris

+0

Entschuldigung - meine Aussage war ziemlich unklar, als ich sagte, dass die Leinwände transparent sind, habe ich tatsächlich darauf hingewiesen, dass sie transparent sind für das Mausereignis in der visuellen Baumhierarchie, deren Hintergründe null sind :) –

+0

Vielen Dank für Ihre Antwort es scheint so albern, dass ich damit zu kämpfen habe! Es ist wirklich so einfach: P. – Citroenfris

3

Ihr Bild verbirgt die Canvases, also deklarieren Sie im XAML die Canvases, nachdem Sie das Image deklariert haben, also werden sie in der Benutzeroberfläche angezeigt und der Click wird wirksam.

Tipp: Geben Sie die Leinwand Hintergrundfarben, nur um zu sehen, wie sie sich in der Benutzeroberfläche rendern. Wenn Sie das tun, können Sie sehen, dass das Bild sie versteckt.

+0

für mich funktioniert es – Erez

+1

Sie sind richtig, es funktioniert. Alles, was ich tun musste, war, die Canvases auf Transparent zu setzen, sonst würde das Klicken auf sie keinen Effekt haben, da sie keine aufgefüllte Farbe haben. Der Tipp hat mir sehr geholfen danke! – Citroenfris