@bestdk2

Как научить PreviewMouseDown выделять элементы внизу иерархии treeview?

Добрый день.
Что есть - treeview с привязанным HierarchicalDataTemplate. Хочу сделать Multiselection. Нашел пример https://www.codeproject.com/Articles/24585/WPF-Mul... Вначале проблема была в том, что автор примера использует TreeViewItem как элементы дерева, в то время как у меня есть свой кастомный класс для элементов (TreeElem) и в sender у SelectedItemChanged приходить объект этого класса. Вначале я хотел получить из него TreeViewItem , но чтобы я не пытался сделать не получалось. Тогда я решил вместо SelectedItemChanged использовать какой-нибудь другой ивент и им стал PreviewMouseDown.
Вот такой код в XAML:
<TreeView x:Name="PrjTreeViev"  
                      Margin="10,10,0,37" 
                      HorizontalAlignment="Left" 
                      Width="174" 
                      > 
<TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <EventSetter Event="PreviewMouseDown" Handler="SelectionChange" />
                    </Style>
 </TreeView.ItemContainerStyle>
 <TreeView.ItemTemplate >
         <HierarchicalDataTemplate ItemsSource="{Binding Path=Elems}" x:Name="Itemsq" >                
                        <StackPanel Orientation="Horizontal" AllowDrop="True" x:Name="panel">
                            <Image Source="{Binding IconSource}" Margin ="0 0 10 0"/>
                            <TextBlock Text="{Binding Name}"  />
                        </StackPanel>    
                    </HierarchicalDataTemplate>
 </TreeView.ItemTemplate>

И вот, для начала, "SelectionChange:
void SelectionChange(object sender, MouseButtonEventArgs e)
{
            Debug.WriteLine("TEST+"+ e.OriginalSource);
            if (sender is TreeViewItem)
                {
                    Debug.WriteLine("TEST2+" + sender);
                    TreeViewItem treeviewItem = sender as TreeViewItem;
                    Debug.WriteLine("TEST3+" + (treeviewItem.Header as TreeElem).Name);
                 }
               e.Handled;
}

Тут я хотел просто хотел узнать, что за элементы у меня выделяются. Вроде определяются правильно, но... экспендер не работает. Как выяснилось, но почему-то, в превью при e.Handled не хочет ни в какую нажиматься экспендер. Тогда я чутка модифицировал код:
void SelectionChange(object sender, MouseButtonEventArgs e)
{
           
 if (!(e.OriginalSource is System.Windows.Shapes.Path)) // если нажатый объект экспендер - то отложим чутка e.Handled
 {
            if (sender is TreeViewItem)
                {
                    Debug.WriteLine("Что за тип +" + sender);
                    TreeViewItem treeviewItem = sender as TreeViewItem;
                    Debug.WriteLine("Имя выделенного элемента +" + (treeviewItem.Header as TreeElem).Name);
                 }
               e.Handled;
else
{
                System.Threading.Timer timer = null;
                timer = new System.Threading.Timer((obj) => 
                {
                    postponed(e);
                    timer.Dispose();
                },
                 null, 1000, System.Threading.Timeout.Infinite);

}
}
 private void postponed(MouseButtonEventArgs e)
{
            Debug.WriteLine("timer");
            e.Handled = true;
}

Теперь вроде бы все хорошо, элементы экспендядтся как нужно, но... При нажатии на элемент на уровень ниже по иерархии, чет высший в sender в SelectionChange приходит элемент выше по иерархии того на который я нажал.
Как это исправить? Возможно не стоить использовать Preview? Но тогда, что использовать?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@bestdk2 Автор вопроса
Проблему решил.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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