Double Click a ListBox item to open a browser

后端 未结 5 739
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-05 04:28

I have a ListBox in my wpf window that binds to an ObervableCollection. I want to open the browser if someone clicks on an element of the Li

5条回答
  •  温柔的废话
    2020-12-05 04:51

    Here's a behavior that gets that done on both ListBox and ListView. This is based of answers from Andrew S. and Vadim Tofan, great job guys!

    public class ItemDoubleClickBehavior : Behavior
    {
        #region Properties
        MouseButtonEventHandler Handler;
        #endregion
    
        #region Methods
    
        protected override void OnAttached()
        {
            base.OnAttached();
    
            AssociatedObject.PreviewMouseDoubleClick += Handler = (s, e) =>
            {
                e.Handled = true;
                if (!(e.OriginalSource is DependencyObject source)) return;
    
                ListBoxItem sourceItem = source is ListBoxItem ? (ListBoxItem)source : 
                    source.FindParent();
    
                if (sourceItem == null) return;
    
                foreach (var binding in AssociatedObject.InputBindings.OfType())
                {
                    if (binding.MouseAction != MouseAction.LeftDoubleClick) continue;
    
                    ICommand command = binding.Command;
                    object parameter = binding.CommandParameter;
    
                    if (command.CanExecute(parameter))
                        command.Execute(parameter);
                }
            };
        }
    
        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.PreviewMouseDoubleClick -= Handler;
        }
    
        #endregion
    }
    

    Here's the extension class used to find the parent.

    public static class UIHelper
    {
        public static T FindParent(this DependencyObject child, bool debug = false) where T : DependencyObject
        {
            DependencyObject parentObject = VisualTreeHelper.GetParent(child);
    
            //we've reached the end of the tree
            if (parentObject == null) return null;
    
            //check if the parent matches the type we're looking for
            if (parentObject is T parent)
                return parent;
            else
                return FindParent(parentObject);
        }
    }
    

    Usage:

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:coreBehaviors="{{Your Behavior Namespace}}"
    
    
    
        
           
        
    
        
           
        
    
    

提交回复
热议问题