XAML或Code Behind中的事件处理程序

时间:2010-01-14 16:16:31

标签: c# silverlight xaml event-handling

我是Silverlight和XAML的新手。在尝试学习语法和最佳实践的过程中,我继续遇到一些差异(或者至少对我来说似乎是这样),有些实现了事件处理程序。

在MSDN的example中,我看到使用了以下代码:

<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>

但是,在设置了鼠标处理程序的情况下,在其他code中我看到了后面代码中使用的这种方法:

 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;
        }

我认为MSDN上的示例是推荐的方式,但是,我倾向于喜欢第二种方法。

这种情况是否有最佳做法?

4 个答案:

答案 0 :(得分:4)

除非我需要动态修改对象的事件处理程序,否则我更喜欢在XAML中定义它。

答案 1 :(得分:4)

在第一种方法中有两个“代码站点”

  1. 定义了UI元素的XAML 事件在同一个地方连线。
  2. 背后的代码中的事件处理程序过程
  3. 在第二个中有3个“代码站点”

    1. 定义UI元素的XAML
    2. 事件连接的构造函数
    3. 背后的代码中的事件处理程序过程
    4. 我个人更喜欢第一种方法。如果我删除一个元素,我只需要找到需要删除的事件处理程序,那么我也不需要编辑类构造函数。

      当然这是经验法则,会有很多例外。

答案 2 :(得分:2)

最佳做法:使用MVVM并将ICommands替换为事件处理程序。

除此之外,没有“最佳实践”用于在xaml中或通过构造函数中的代码以声明方式设置事件处理程序。由你决定。

但是,我认为,大多数人都希望看到xaml中的声明,因为这就是你设计UI的地方。

答案 3 :(得分:0)

对于它的价值,如果你试图通过字符串将xaml分配给模板,事件处理程序将无法工作...参见post:

Event handlers when using a string as a data template for dataform in Silverlight