2010-01-14 16 views
7

Ich bin neu in Silverlight und XAML. Während ich versuche, die Syntax und die Best Practices zu lernen, stoße ich weiterhin auf eine Diskrepanz (oder zumindest auf mich scheint es so) in der Art und Weise, wie einige Event-Handler implementieren.Event-Handler in XAML oder Code hinter

In einem example von MSDN ich den folgenden Code gebraucht:

<UserControl x:Class="DragAndDropSimple.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300"> 
    <Canvas x:Name="rootCanvas" 
    Width="640" 
    Height="480" 
    Background="Gray" 
    > 
    <!-- You can drag this rectangle around the canvas. --> 
    <Rectangle 
    MouseLeftButtonDown="Handle_MouseDown" 
    MouseMove="Handle_MouseMove" 
    MouseLeftButtonUp="Handle_MouseUp" 
    Canvas.Left="30" Canvas.Top="30" Fill="Red" 
    Width="50" Height="50" /> 
    </Canvas> 

</UserControl> 

Wo die Maus-Handler festgelegt sind, jedoch in anderen code ich diese Methode in der Code-behind verwendet gesehen haben:

public Window1() 
     { 
      InitializeComponent(); 

      TransformGroup group = new TransformGroup(); 

      ScaleTransform xform = new ScaleTransform(); 
      group.Children.Add(xform); 

      TranslateTransform tt = new TranslateTransform(); 
      group.Children.Add(tt); 

      image.RenderTransform = group; 

      image.MouseWheel += image_MouseWheel; 
      image.MouseLeftButtonDown += image_MouseLeftButtonDown; 
      image.MouseLeftButtonUp += image_MouseLeftButtonUp; 
      image.MouseMove += image_MouseMove; 
     } 

Ich würde annehmen, dass das Beispiel auf MSDN der empfohlene Weg ist, jedoch neige ich dazu, die zweite Methode zu mögen.

Gibt es eine Best Practice für diese Situation?

+0

weder! benutze Befehle! ;) Ich würde eine richtige Probe als Antwort schreiben, aber ich bin ein wenig rostig selbst –

Antwort

4

Wenn ich die Event-Handler für ein Objekt nicht dynamisch ändern muss, definiere ich es lieber im XAML selbst.

+0

Wenn ich Ereignis in XAML abonniere, wird es automatisch abbestellen? – onmyway133

2

Best Practice: Verwenden Sie MVVM und ersetzen Sie ICommands für Ereignishandler.

Darüber hinaus gibt es keine "Best Practice" zum Festlegen von Ereignishandlern deklarativ in XAML oder über Code in Konstruktoren. Es liegt an dir.

Ich würde jedoch denken, dass die meisten Menschen erwarten würden, die Deklarationen in der XAML zu sehen, da Sie dort die UI entwerfen.

+4

Dies ist die ziemlich große Annahme, dass MVVM immer "Best Practice" ist.Ich bin mir nicht sicher, ob das immer stimmt. – AnthonyWJones

+1

Schau, wenn du in dieser Schlacht sterben willst, mehr Kraft für dich. Was mich betrifft, würde ich gerne unsere neuen MVVM Overlords willkommen heißen. Im Ernst, ich würde gerne den Fall sehen (abgesehen von der einfachsten Anwendung), wo MVVM nicht die beste Wahl wäre. – Will

4

Im ersten Ansatz gibt es zwei „Kodestellen“

  1. die XAML, wo die UI-Elemente und die Ereignisse definiert sind, werden an der gleichen Stelle verdrahtet.
  2. das Ereignishandler Verfahren in Code hinter

Im zweiten gibt es 3 "-Code sites"

  1. den XAML wo die Oberflächenelemente
  2. den Konstruktor definiert sind, wo die Ereignisse verdrahtet up
  3. der Event-Handler Verfahren in Code hinter

Persönlich bevorzuge ich den ersten Ansatz. Wenn ich ein Element lösche, muss ich nur die Ereignisbehandlungsroutinen finden, die entfernt werden müssen. Ich muss dann auch nicht den Klassenkonstruktor bearbeiten.

Natürlich ist dies eine Faustregel, es gibt viele Ausnahmen.