Silverlight 5双击始终将ClickCount返回为1

时间:2012-03-19 03:54:44

标签: c# .net silverlight

我为DataGrid创建了检测双击的行为:

public class DataGridDoubleClickBehavior : Behavior<DataGrid>    
    {
        public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(
            "CommandParameter",
            typeof(object),
            typeof(DataGridDoubleClickBehavior),
            new PropertyMetadata(null));        

        public object CommandParameter
        {
            get { return GetValue(CommandParameterProperty); }            
            set { SetValue(CommandParameterProperty, value); }
        }

        public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register(
            "DoubleClickCommand",
            typeof(ICommand),
            typeof(DataGridDoubleClickBehavior),
            new PropertyMetadata(null));       

        public ICommand DoubleClickCommand
        {
            get { return (ICommand)GetValue(DoubleClickCommandProperty); }            
            set { SetValue(DoubleClickCommandProperty, value); }
        }

        protected override void OnAttached()
        {
            this.AssociatedObject.LoadingRow += this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow += this.OnUnloadingRow;

            base.OnAttached();
        }

        protected override void OnDetaching()
        {
            this.AssociatedObject.LoadingRow -= this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow -= this.OnUnloadingRow;

            base.OnDetaching();
        } 

        private void OnLoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.MouseLeftButtonUp += this.OnMouseLeftButtonUp;
        }

        private void OnUnloadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.MouseLeftButtonUp -= this.OnMouseLeftButtonUp;
        }

        private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount < 2) return;

            if (this.DoubleClickCommand != null) this.DoubleClickCommand.Execute(this.CommandParameter);
        }
    }

一切似乎没有问题,只是它没有注册多次点击。总是在OnMouseLeftButtonUp ClickCount中1.有人知道为什么吗?

5 个答案:

答案 0 :(得分:11)

我找到了一个非常简单的解决方案。只需替换事件处理程序注册语法

即可
myDataGrid.MouseLeftButtonDown += this.MyDataGrid_MouseLeftButtonDown;

使用AddHandler语法

myDataGrid.AddHandler(DataGrid.MouseLeftButtonDownEvent,
    new MouseButtonEventHandler(this.MyDataGrid_MouseLeftButtonDown),
    handledEventsToo: true)

这样就可以指定魔术布尔handledEventsToo参数。

这也将处理处理过的事件。

答案 1 :(得分:3)

嗯,这里更大的麻烦是当你点击DataGrid的行时,不会引发MouseLeftButtonDown,因为这个点击正在行级处理。

我一直放弃直接处理某些控件。我有自己的DataGrid,DataForm等派生版本。这只会让我的解决方案很容易推出,因为我还是不使用vanilla版本。

我添加了一个名为ClickIncludingHandled的新事件,它有点罗嗦,但它正确描述了正在发生的事情并且很好地出现在下面点击智能感知 - 如果控件有一个Click事件开始。

无论如何,下面是我的实现。然后,您可以订阅此事件并使用ClickCount确定要捕获的点击次数。我注意到它有点慢,但干净利落。

public partial class DataGridBase : DataGrid
{
        public event MouseButtonEventHandler ClickIncludingHandled;

        public DataGridBase() : base()
        {
            this.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(OnClickInclHandled), true);
        }

        private void OnClickInclHandled(object sender, MouseButtonEventArgs e)
        {
            if (ClickIncludingHandled != null)
            {
                ClickIncludingHandled(sender, e);
            }
        }
}

答案 2 :(得分:1)

关于在WPF和Silverlight中捕获ClickCount,MouseButtonUp已被破坏(它已被多次记录,但微软已选择不修复它)。您需要使用MouseButtonDown事件。

答案 3 :(得分:0)

不是100%肯定这是问题,但我注意到Pete Brown的样本使用的是MouseLeftButtonDown:

http://10rem.net/blog/2011/04/13/silverlight-5-supporting-double-and-even-triple-click-for-the-mouse

答案 4 :(得分:0)

我遇到了同样的问题。我无法以任何合理的方式解决它,所以这样解决它:

    private DateTime _lastClickTime;
    private WeakReference _lastSender;

    private void Row_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var now = DateTime.Now;
        if ((now - _lastClickTime).TotalMilliseconds < 200 && _lastSender != null && _lastSender.IsAlive && _lastSender.Target == sender)
        {
            if (Command != null)
            {
                Command.Execute(CommandParameter);
            }
        }
        _lastClickTime = now;
        _lastSender = new WeakReference(sender);
    }

它很脏但是有效。