我是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上的示例是推荐的方式,但是,我倾向于喜欢第二种方法。
这种情况是否有最佳做法?
答案 0 :(得分:4)
除非我需要动态修改对象的事件处理程序,否则我更喜欢在XAML中定义它。
答案 1 :(得分:4)
在第一种方法中有两个“代码站点”
在第二个中有3个“代码站点”
我个人更喜欢第一种方法。如果我删除一个元素,我只需要找到需要删除的事件处理程序,那么我也不需要编辑类构造函数。
当然这是经验法则,会有很多例外。
答案 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