65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 拖放自定义控件

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (6投票s)

2008年10月25日

CPOL

2分钟阅读

viewsIcon

48119

downloadIcon

1043

如何创建自定义控件和拖放功能

引言

一切始于一个微软活动,在那里我得以预览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日:初始发布
© . All rights reserved.