﻿<?xml version="1.0" encoding="utf-8"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Intersoft Community - ClientUI - Contrib: Blend Triger for GridPresenter Mouse Double Click</title><link>http://www.intersoftsolutions.com/Community/ClientUI/Blend-Triger-for-GridPresenter-Mouse-Double-Click/</link><description /><generator>http://www.intersoftsolutions.com</generator><language>en</language><copyright>Copyright 2002 - 2015 Intersoft Solutions Corp. All rights reserved.</copyright><ttl>60</ttl><item><title>Contrib: Blend Triger for GridPresenter Mouse Double Click</title><link>http://www.intersoftsolutions.com/Community/ClientUI/Blend-Triger-for-GridPresenter-Mouse-Double-Click/</link><pubDate>Thu, 20 Jan 2011 21:19:13 GMT</pubDate><dc:creator>Glayaar</dc:creator><description>&lt;p&gt;Thank you for the tips. Other user who share the same scenario might find this very useful.&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Contrib: Blend Triger for GridPresenter Mouse Double Click</title><link>http://www.intersoftsolutions.com/Community/ClientUI/Blend-Triger-for-GridPresenter-Mouse-Double-Click/</link><pubDate>Tue, 18 Jan 2011 18:25:00 GMT</pubDate><dc:creator>JosephGershgorin</dc:creator><description>&lt;p&gt;&lt;span style="color: rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 14px; line-height: 19px; "&gt;Just thought I'd share this snippet for others that may find this code useful. I had a read only grid that I wanted to execute a viewmodel command in response to a double click anywhere on a row, this is adapted from a trigger I wrote for another grid control. (To get this to work with a UXListBox create a new copy of this class and replace "GridPresenter" with "UXListBox" and "GirdPresenterRowElement" with "UXListBoxItem").&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 14px; line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 14px; line-height: 19px; " /&gt;&lt;/p&gt;&lt;pre&gt;using System;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Interactivity;
    using System.Linq;
    using System.Collections.Generic;
    using System.Windows.Media;
    using Intersoft.Client.Data.DataPresenter;
    public class IntersoftGridPresenterRowMouseDoubleClickTrigger : TriggerBase&amp;lt;GridPresenter&amp;gt;
    {
        private static readonly Type TriggerType = typeof(IntersoftGridPresenterRowMouseDoubleClickTrigger);
        private MouseButtonEventHandler _gridViewMouseLeftButtonUpHandler;
        private DateTime _lastMouseUpDateTime = DateTime.Now;
        private bool _hasFirstMouseUpOccured = false;
        private Point _firstMouseUpPosition;
        #region Dependency Properties
        #region DelayBetweenClicks Dependency Property
        public static readonly DependencyProperty DelayBetweenClicksProperty =
           DependencyProperty.Register("DelayBetweenClicks", typeof(TimeSpan), TriggerType,
           new PropertyMetadata(TimeSpan.FromMilliseconds(500), OnDelayBetweenClicksPropertyChanged));
        private static void OnDelayBetweenClicksPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ((IntersoftGridPresenterRowMouseDoubleClickTrigger)sender).OnDelayBetweenClicksPropertyChanged(e);
        }
        protected virtual void OnDelayBetweenClicksPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
        }
        public TimeSpan DelayBetweenClicks
        {
            get { return (TimeSpan)GetValue(DelayBetweenClicksProperty); }
            set { SetValue(DelayBetweenClicksProperty, value); }
        }
        #endregion DelayBetweenClicks Dependency Property
        #region AllowedPixelMargin Dependency Property
        public static readonly DependencyProperty AllowedPixelMarginProperty =
           DependencyProperty.Register("AllowedPixelMargin", typeof(int), TriggerType,
           new PropertyMetadata(4, OnAllowedPixelMarginPropertyChanged));
        private static void OnAllowedPixelMarginPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ((IntersoftGridPresenterRowMouseDoubleClickTrigger)sender).OnAllowedPixelMarginPropertyChanged(e);
        }
        protected virtual void OnAllowedPixelMarginPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
        }
        public int AllowedPixelMargin
        {
            get { return (int)GetValue(AllowedPixelMarginProperty); }
            set { SetValue(AllowedPixelMarginProperty, value); }
        }
        #endregion AllowedPixelMargin Dependency Property
        #endregion Dependency Properties
        protected override void OnAttached()
        {
            if (AssociatedObject != null)
            {
                _gridViewMouseLeftButtonUpHandler = new MouseButtonEventHandler(OnGridViewMouseLeftButtonUp);
                AssociatedObject.AddHandler(UIElement.MouseLeftButtonUpEvent, _gridViewMouseLeftButtonUpHandler, true);
            }
            base.OnAttached();      
        }
        protected override void OnDetaching()
        {
            if (AssociatedObject != null &amp;amp;&amp;amp; _gridViewMouseLeftButtonUpHandler != null)
            {
                AssociatedObject.RemoveHandler(UIElement.MouseLeftButtonUpEvent, _gridViewMouseLeftButtonUpHandler);
                _gridViewMouseLeftButtonUpHandler = null;
            }
            base.OnDetaching();
        }
        private static bool IsGridViewRow(GridPresenter gridPresenter, Point mousePosition, ref object rowDataContext)
        {
            GeneralTransform gt = gridPresenter.TransformToVisual(Application.Current.RootVisual);
            Point mousePositionOffset = gt.Transform(mousePosition);
            IEnumerable&amp;lt;UIElement&amp;gt; hitElements = VisualTreeHelper.FindElementsInHostCoordinates(mousePositionOffset, gridPresenter);
            
            var gridViewRow = hitElements.OfType&amp;lt;GridPresenterRowElement&amp;gt;().FirstOrDefault();
            if (gridViewRow != null)
            {
                rowDataContext = gridViewRow.DataContext;
            }
            return gridViewRow != null;
        }
        private void OnGridViewMouseLeftButtonUp(object sender, MouseButtonEventArgs args)
        {
            DateTime currentMouseUpDateTime = DateTime.Now;
            TimeSpan timeSpanBetweenButtonUps = currentMouseUpDateTime - _lastMouseUpDateTime;
            // First Mouse Up
            if (timeSpanBetweenButtonUps &amp;gt; DelayBetweenClicks || _hasFirstMouseUpOccured == false)
            {
                _firstMouseUpPosition = args.GetPosition(AssociatedObject);
                _hasFirstMouseUpOccured = true;
                _lastMouseUpDateTime = DateTime.Now;
            }
            else
            {
                Point currentMousePosition = args.GetPosition(AssociatedObject);
                object rowDataContext = null;
                // Second mouse up is 
                // A.) Within specified miliseconds of first mouse up.
                // B.) Allowed pixels margin of first mouse up
                // C.) Pointer position is within a GridPresenterRowElement
                if ((Math.Abs(_firstMouseUpPosition.X - currentMousePosition.X) &amp;lt; AllowedPixelMargin &amp;amp;&amp;amp; Math.Abs(_firstMouseUpPosition.Y - currentMousePosition.Y) &amp;lt; AllowedPixelMargin)
                    &amp;amp;&amp;amp; IsGridViewRow(AssociatedObject, currentMousePosition, ref rowDataContext)
                    )
                {
                    InvokeActions(args);
                }
                _hasFirstMouseUpOccured = false;
            }
        }
    }&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Here's the XAML:&lt;/p&gt;
&lt;p /&gt;&lt;pre&gt;&amp;lt;Intersoft:GridPresenter SelectedItem="{Binding MySelectedItem, Mode=TwoWay}"&amp;gt;
	&amp;lt;Interactivity:Interaction.Triggers&amp;gt;
	    &amp;lt;BlendTriggers:IntersoftGridPresenterRowMouseDoubleClickTrigger&amp;gt;
	        &amp;lt;BehaviorActions:InvokeCommandAction 
                    Command="{Binding Path=TestCommand}" /&amp;gt; 
	    &amp;lt;/BlendTriggers:IntersoftGridPresenterRowMouseDoubleClickTrigger&amp;gt;
	&amp;lt;/Interactivity:Interaction.Triggers&amp;gt;
&amp;lt;/Intersoft:GridPresenter&amp;gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p /&gt;</description></item></channel></rss>