2010-01-14 61 views
7

我是Silverlight和XAML的新手。在尝试学习语法和最佳实践时,我仍然遇到了一些实现事件处理程序的方式中的差异(或者至少对我来说似乎是这样)。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上的例子是推荐的方式,但是,我倾向于喜欢第二种方法。

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

+0

没有!使用命令! ;)我会写一个适当的样本作为答案,但我自己有点生疏 – 2010-01-14 16:20:14

回答

4

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

+0

如果我订阅XAML中的事件,它会自动取消订阅吗? – onmyway133 2012-11-07 12:05:06

2

最佳实践:使用MVVM并用ICommands代替事件处理程序。

除此之外,在xaml中声明式设置事件处理函数或通过构造函数中的代码没有“最佳实践”。随你便。

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

+4

这使得MVVM始终是“最佳实践”这一相当大的假设。我不确定这总是如此。 – AnthonyWJones 2010-01-14 16:24:27

+1

看,如果你想在那场战斗中死去,给你更多的力量。至于我,我想首先欢迎我们新的MVVM霸主。真的,我希望看到MVVM不是最佳选择的情况(除了最基本的应用程序之外)。 – Will 2010-01-14 17:21:36

4

在第一种方法有两个“码网站”

  1. 其中UI元素被定义事件在同一个地方有线了XAML。
  2. 在代码中的事件处理程序的程序后面

在第二有3“码点”

  1. 其中UI元素被定义的XAML
  2. 其中事件是有线的构造up
  3. 代码后面的事件处理程序代码

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

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

相关问题