Двойной щелчок Silverlight 5 всегда возвращает ClickCount как 1 - PullRequest
8 голосов
/ 19 марта 2012

Я создал поведение для 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 ]

11 голосов
/ 19 апреля 2012

Я нашел очень простое решение. Просто замените синтаксис регистрации обработчика событий

myDataGrid.MouseLeftButtonDown += this.MyDataGrid_MouseLeftButtonDown;

с синтаксисом AddHandler

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

Таким образом можно указать магический логический аргумент handledEventsToo.

Это также будет обрабатывать обработанные события.

3 голосов
/ 26 марта 2012

Ну, большая проблема в том, что когда вы щелкаете по строкам DataGrid, MouseLeftButtonDown не поднимается, потому что этот щелчок обрабатывается на уровне строк.

Я давно отказался от работы с некоторыми элементами управления напрямую.У меня есть собственная производная версия DataGrid, DataForm и т. Д. Это только облегчает развертывание моего решения, потому что я в любом случае не использую версии vanilla.

Я добавил новое событие под названием ClickInclusionHandled,это немного многословно, но оно правильно описывает, что происходит, и будет приятно отображаться прямо под Click с IntelliSense - если элемент управления имеет событие 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);
            }
        }
}
1 голос
/ 30 марта 2012

MouseButtonUp не работает в отношении захвата ClickCount в WPF и Silverlight (это было записано много раз, но Microsoft решила не исправлять это). Вам необходимо использовать события MouseButtonDown.

0 голосов
/ 30 марта 2012

Я столкнулся с этой же проблемой.Мне не удалось решить его каким-либо разумным способом, поэтому обошел его так:

    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);
    }

Это грязно, но работает.

0 голосов
/ 19 марта 2012

Не на 100% уверен, что это проблема, но я заметил, что в примере с Питом Брауном вместо этого используется MouseLeftButtonDown:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...