none
WPF FAQ – Comment faire sélection ‘lasso’ dans le contrôle ListBox/ListView RRS feed

  • Discussion générale

  • La sélection ‘lasso’ est utilisée dans la plupart des logiciels de manipulation graphique et elle est une modalité convenable pour sélectionner plusieurs objets sur l’écran. Le code suivant montre comment activer ce type de sélection pour les contrôles 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
    {
       
    // Ce champ est utilise pour determiner si ListBox est en mode selection avec la souris
        private Boolean inMouseSelectionMode = false;

       
    // ce champ est utilise pour tenir l’evidence des elements selectionnes avec la souris
        private List<ListBoxItem> selectedItems = new List<ListBoxItem>();

       
    public Window1()
        {
            InitializeComponent();
        }

       
    private void ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
           
    // si la souris est If the mouse is leve, desactiver "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;

               
    // activez l’element surpasse par la souris
                mouseOverItem.SetValue(TextElement.ForegroundProperty, SystemColors.HighlightTextBrush);

               
    if (!selectedItems.Contains(mouseOverItem))
                {
                    selectedItems.Add(mouseOverItem);
                }
            }
        }

       
    private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
          

            listBox.SelectedIndex = -1;
            inMouseSelectionMode =
    true;
           
    foreach (ListBoxItem item in selectedItems)
            {
                item.ClearValue(
    ListBoxItem.BackgroundProperty);
                item.ClearValue(
    TextElement.ForegroundProperty);
            }

            selectedItems.Clear();
        }
    }

     

    Pour plusieurs informations sur WPF, consultez la page Formation WPF – Foire aux Questions

    lundi 28 juin 2010 13:00