Мое предложение: начать с малого. Только запустите путем запоминания маленького набора большинства полезных команд. Когда я запустил vi, они были моими лучшими 10:
, Большое основное редактирование может быть сделано с помощью только эти команды. Как только Вы становитесь удобными, остальные не выглядят слишком трудными.
BTW, я хотел бы добавить, что я раньше полагался на vi для моего основного текстового редактора, но теперь только если я имею к. В моем случае производительность лучше, когда я использую инструменты как Emacs или Visual Studio (отметьте: "в моем случае"). Попробуйте больше чем один инструмент и выберите тот, который помогает Вашей производительности больше всего.Удачи!
Итак ... став счастливым обладателем значка перекати-поле, я вернулся к этому, чтобы попытаться найти способ обойти это. ; -)
Я не уверен, что мне нравится это решение, поэтому я все еще очень открыт для любых лучших подходов.
По сути, в конечном итоге я запомнил, на каком 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>