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

Irw*_*her 8 c# silverlight xaml event-handling

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

在MSDN 的示例中,我看到使用以下代码:

<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>
Run Code Online (Sandbox Code Playgroud)

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

 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;
        }
Run Code Online (Sandbox Code Playgroud)

我会假设MSDN上的示例是推荐的方式,但是,我倾向于喜欢第二种方法.

这种情况有最好的做法吗?

Ant*_*nes 5

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

  1. XAML,其中定义了UI元素,并且事件在同一位置连接。
  2. 事件处理程序中的代码在后面

在第二个中,有3个“代码站点”

  1. 定义UI元素的XAML
  2. 连接事件的构造函数
  3. 事件处理程序中的代码在后面

我个人更喜欢第一种方法。如果删除一个元素,我只需要找到需要删除的事件处理程序,那么就不需要编辑类构造函数了。

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


Par*_*ots 4

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