Как мне заставить ListBox, Canvas и Thumb работать вместе?
Я пытаюсь повторно использовать логику выбора ListBox вместе с Canvas, который содержит перетаскиваемые большие пальцы.
К сожалению, большой палец, кажется, обрабатывает события мыши, так что нажатие на большой палец не делает выбранный элемент.
Я надеялся, что эти элементы можно заставить работать вместе, не прибегая к обходным путям в процедурном коде. Если кто-нибудь знает, возможно ли это или как это сделать, пожалуйста, сообщите мне.
Ниже приведены примеры кодов.
В XAML я определяю ListBox и указываю Canvas в качестве ItemsPanel:
<Window x:Class="ListBoxCanvasThumb.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Loaded="Window_Loaded"
>
<Grid>
<ListBox
x:Name="listBox"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
</Window>
В обработчике событий Loaded я создаю перетаскиваемый Thumb, оборачиваю его в ListBoxItem, устанавливаю положение в Canvas и затем добавляю его в ListBox:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thumb t = new Thumb();
t.Width = 10;
t.Height = 10;
t.DragDelta += new DragDeltaEventHandler(thumb_DragDelta);
ListBoxItem i = new ListBoxItem();
Canvas.SetLeft(i, 10);
Canvas.SetTop(i, 10);
i.Content = t;
listBox.Items.Add(i);
}
В обработчике событий DragDelta я обновляю позицию элемента в Canvas:
void thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
ListBoxItem i = (ListBoxItem)((Thumb)sender).Parent;
Canvas.SetLeft(i, Canvas.GetLeft(i) + e.HorizontalChange);
Canvas.SetTop(i, Canvas.GetTop(i) + e.VerticalChange);
}