Перетаскивание WPF от ListBox с SelectionMode Несколько

Мое предложение: начать с малого. Только запустите путем запоминания маленького набора большинства полезных команд. Когда я запустил vi, они были моими лучшими 10:

  • (Esc) для возврата к командному режиму (самый важный!)
  • для добавления текста после курсора
  • для добавления текста в конце текущей строки
  • x для удаления 1 символа
  • dd для удаления 1 строки
  • R для замены текста (перезапись)
  • u для отмены
  • : q! (Войдите) для выхода, не сохраняя
  • : w (Входят) для сохранения
  • ZZ, чтобы сохранить и выйти

, Большое основное редактирование может быть сделано с помощью только эти команды. Как только Вы становитесь удобными, остальные не выглядят слишком трудными.

BTW, я хотел бы добавить, что я раньше полагался на vi для моего основного текстового редактора, но теперь только если я имею к. В моем случае производительность лучше, когда я использую инструменты как Emacs или Visual Studio (отметьте: "в моем случае"). Попробуйте больше чем один инструмент и выберите тот, который помогает Вашей производительности больше всего.Удачи!

23
задан Michael Myers 21 September 2012 в 19:06
поделиться

1 ответ

Итак ... став счастливым обладателем значка перекати-поле, я вернулся к этому, чтобы попытаться найти способ обойти это. ; -)

Я не уверен, что мне нравится это решение, поэтому я все еще очень открыт для любых лучших подходов.

По сути, в конечном итоге я запомнил, на каком ListBoxItem был последний раз щелкен, и затем убедитесь который добавляется к выбранным элементам перед перетаскиванием. Это также означало смотреть, как далеко перемещается мышь, прежде чем начать перетаскивание - потому что щелчок по выбранному элементу, чтобы отменить выбор, иногда может привести к тому, что он снова будет выбран, если отскок мыши запускает небольшую операцию перетаскивания.

Наконец, я добавил немного горячего отслеживание элементов списка, поэтому, если вы наведете указатель мыши на выбранный элемент, он выбор будет отменен, но вы все равно получите обратную связь, чтобы указать, что он будет включен в операцию перетаскивания.

private void HandleLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var source = (FrameworkElement)sender;
    var hitItem = source.InputHitTest(e.GetPosition(source)) as FrameworkElement;
    hitListBoxItem = hitItem.FindVisualParent<ListBoxItem>();
    origPos = e.GetPosition(null);
}
private void HandleLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    hitListBoxItem = null;
}
private void HandleMouseMove(object sender, MouseEventArgs e)
{
    if (ShouldStartDrag(e))
    {
        hitListBoxItem.IsSelected = true;

        var sourceItems = (FrameworkElement)sender;
        var viewModel = (WindowViewModel)DataContext;
        DragDrop.DoDragDrop(sourceItems, viewModel, DragDropEffects.Move);
        hitListBoxItem = null;
    }
}
private bool ShouldStartDrag(MouseEventArgs e)
{
    if (hitListBoxItem == null)
        return false;

    var curPos = e.GetPosition(null);
    return
  Math.Abs(curPos.Y-origPos.Y) > SystemParameters.MinimumVerticalDragDistance ||
  Math.Abs(curPos.X-origPos.X) > SystemParameters.MinimumHorizontalDragDistance;
}

Изменения XAML включают горячее отслеживание ...

<Style TargetType="ListBoxItem">
    <Setter Property="Margin" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Grid>
                  <Border Background="{TemplateBinding Background}" />
                  <Border Background="#BEFFFFFF" Margin="1">
                    <Grid>
                      <Grid.RowDefinitions>
                        <RowDefinition /><RowDefinition />
                      </Grid.RowDefinitions>
                      <Border Margin="1" Grid.Row="0" Background="#57FFFFFF" />
                    </Grid>
                  </Border>
                  <ContentPresenter Margin="8,5" />
                </Grid>
                <ControlTemplate.Triggers>
                  <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="PowderBlue" />
                  </Trigger>
                  <MultiTrigger>
                    <MultiTrigger.Conditions>
                      <Condition Property="IsMouseOver" Value="True" />
                      <Condition Property="IsSelected" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" Value="#5FB0E0E6" />
                  </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
13
ответ дан 29 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: