Silverlight 拖放自定义控件





3.00/5 (6投票s)
如何创建自定义控件和拖放功能
引言
一切始于一个微软活动,在那里我得以预览Digg Sample的炫酷之处,当时它既未发布到网上,Silverlight beta 1 和 beta 2 正在开发中。
我个人认为 RIA(富互联网应用)正在成为 Web 上的 Windows,原因如下:
- 在 Silverlight 中,你是在客户端环境中工作,没有回发。
- 在 Silverlight 中,你可以像 WPF 应用程序一样动画用户交互。
- 在 Silverlight 中,你可以创建一个可以通过应用程序样式自定义的控件,我知道这听起来像 CSS,但它更进一步。
Using the Code
拖放控件是一个基于用户控件的控件,它为用户提供了忘记在代码中设置鼠标捕获事件的能力。
public class DragControl : UserControl
{
private bool _isMouseDown;
private Point _lastPosition;
int zIndex = 0;
请注意额外的变量,它们将在事件中帮助你,因为我们不想一遍又一遍地重做所有事情,尤其是在我们不需要的时候。然后你需要鼠标的事件,在鼠标按下时,你应该能够检测到它并将你的控件放置在任何其他控件的顶部,我使用了一个BringToFront()
方法来帮助我执行此操作。
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
_isMouseDown = true;
BringToFront();
this.CaptureMouse();
_lastPosition = e.GetPosition(Application.Current.RootVisual);
base.OnMouseLeftButtonDown(e);
}
现在我们有了按钮按下事件,我们需要 Up 事件。这很简单,因为我们只需要说停止在这里,不要继续任何操作。
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
_isMouseDown = false;
zIndex = 0;
this.ReleaseMouseCapture();
base.OnMouseLeftButtonUp(e);
}
最后,我们需要MouseMouse
事件。这是处理控件移动的事件。
protected override void OnMouseMove(MouseEventArgs e)
{
if (_isMouseDown)
{
Point currentPosition = e.GetPosition(Application.Current.RootVisual);
Canvas.SetLeft(this, currentPosition.X);
Canvas.SetTop(this, currentPosition.Y);
_lastPosition = currentPosition;
}
base.OnMouseMove(e);
}
同样重要的是我们的BringToFront()
函数,它可以帮助你提供点击后将窗口置顶的功能。请注意,我的主控件是一个 Canvas,这就是为什么我将父控件转换为 Canvas 的原因。
protected void BringToFront()
{
if (zIndex == 0)
{
var oldIndex = this.zIndex;
var mainCanvas = this.Parent as Canvas;
foreach (FrameworkElement fElement in mainCanvas.Children)
{
Canvas.SetZIndex(fElement, 0);
}
Canvas.SetZIndex(this, 2);
zIndex = 1;
}
关注点
你会发现,如果父控件是 Canvas,BringtoFront
方法才能正常工作。有趣的是,如果你使用的是 StackPanel 或 Grid,那么你将不得不完成这项工作。
Canvas 是一个完美的例子,因为它允许使用 left 和 top 属性来定位控件。
注意:由于某种原因,首次编译时,VS2008 会生成代码隐藏文件(文件名为.g.cs)。请确保更改此处声明的基础类,以使其正常工作。
历史
- 2008年10月25日:初始发布