locked
Как сделать лассо выделение(drag & select) в ListBox/ListView RRS feed

  • Общие обсуждения

  • Лассо выделение используется очень часто во многих графических редакторах, это удобный способ выделения нескольких объектов на экране. Здесь показано как реализовать этот тип выделения в WPF ListBox/ListView элементах:


    <ListBox Name="listBox"
            Width="200" 
            Height="200" 
            SelectionMode="Multiple">
      <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
          <EventSetter Event="ListBoxItem.PreviewMouseLeftButtonDown" 
                      Handler="ListBoxItem_PreviewMouseLeftButtonDown"/>
          <EventSetter Event="ListBoxItem.PreviewMouseUp" 
                      Handler="ListBoxItem_PreviewMouseUp"/>
          <EventSetter Event="ListBoxItem.PreviewMouseMove" 
                      Handler="ListBoxItem_PreviewMouseMove"/>
        </Style>
      </ListBox.Resources>
      <x:Type TypeName="DependencyObject"/>
      <x:Type TypeName="Visual"/>
      <x:Type TypeName="UIElement"/>
      <x:Type TypeName="FrameworkElement"/>
      <x:Type TypeName="Control"/>
    </ListBox>
    


    public partial class Window1 : Window
    {
        // This field is used to tell if ListBox is in mouse selection mode.
        private Boolean inMouseSelectionMode = false;
    
        // This field is used to keep track of the current mouse selected items.
        private List<ListBoxItem> selectedItems = new List<ListBoxItem>();
    
        public Window1()
        {
            InitializeComponent();
        }
    
        private void ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            // If the mouse is up, turn off "inMouseSelectionMode"
            inMouseSelectionMode = false;
        }
    
        private void ListBoxItem_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            ListBoxItem mouseOverItem = sender as ListBoxItem;
            if (mouseOverItem != null && inMouseSelectionMode && e.LeftButton == MouseButtonState.Pressed)
            {
                mouseOverItem.Background = SystemColors.HighlightBrush;
    
                // Highlight the currently mouse-overed item.
                mouseOverItem.SetValue(TextElement.ForegroundProperty, SystemColors.HighlightTextBrush);
    
                if (!selectedItems.Contains(mouseOverItem))
                {
                    selectedItems.Add(mouseOverItem);
                }
            }
        }
    
        private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // When the mouse is down, we need to clear all previously mouse selected items.
            listBox.SelectedIndex = -1;
            inMouseSelectionMode = true;
            foreach (ListBoxItem item in selectedItems)
            {
                item.ClearValue(ListBoxItem.BackgroundProperty);
                item.ClearValue(TextElement.ForegroundProperty);
            }
    
            selectedItems.Clear();
        }
    }
    


    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 23:03 MSDN Forums consolidation (От:Разработка Windows-приложений)
    17 марта 2010 г. 11:49
    Модератор