WPF расширяет TreeView одним щелчком мыши - PullRequest
7 голосов
/ 04 марта 2011

У меня есть WPF TreeView с HierarchicalDataTemplate.

В настоящее время мне нужно дважды щелкнуть элемент, чтобы развернуть / свернуть его.

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

Каков рекомендуемый способ сделать это?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 04 марта 2011

Вы можете использовать повторно установленный флажок в качестве вашего узла (содержащий любой шаблон, который вы используете в настоящее время) со свойством IsChecked, связанным со свойством IsExpanded TreeViewItem.

Вот шаблон, который я только чтотест, который, кажется, выполняет свою работу:

<HierarchicalDataTemplate ItemsSource="{Binding Items}">
    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}">
        <CheckBox.Template>
            <ControlTemplate>
                <TextBlock Text="{Binding Header}"></TextBlock>
            </ControlTemplate>
        </CheckBox.Template>
    </CheckBox>
</HierarchicalDataTemplate>

Просто замените содержимое ControlTemplate всем, что вам нужно.

4 голосов
/ 04 марта 2011

Если вы используете стандарт TreeViewItem, то вы можете зафиксировать событие щелчка:

private void OnTreeViewMouseUp( object sender, MouseButtonEventArgs e )
{
    var tv = sender as TreeView;
    var item = tv.SelectedItem as TreeViewItem;

    if( item != null )
        item.IsExpanded = !item.IsExpanded;

    e.Handled = true;
}

private void OnTreeViewPreviewMouseDoubleClick( object sender, MouseButtonEventArgs e )
{
    e.Handled = true;
}

Скорее всего, в вашем случае вам нужно будет что-то сделать с привязкой и ViewModel.Вот хорошая статья из CodePlex: Упрощение WPF TreeView с помощью шаблона ViewModel .

1 голос
/ 04 марта 2015

Просто используйте событие выбранного элемента и используйте следующее,

private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeViewItem item = (TreeViewItem)treeview.SelectedItem;
        item.IsExpanded = true;


    }

где treeview - это имя вашего TreeView, вы можете включить, если закрыть / открыть, основываясь на его текущем состоянии.

0 голосов
/ 28 января 2014

Ответ Metro Smurf (благодаря которому я добился того, чего хотел), предлагает правильный подход.Вы можете просто подключиться к событию SelectedItemChanged Treeview.Затем приведите значение e.NewValue, переданное в обработчик событий, к TreeViewItem и получите доступ к его свойству IsExpanded, чтобы установить для него значение true.

void MyFavoritesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    ((TreeViewItem)e.NewValue).IsExpanded = true;
}

Затем для последнего прикосновения вы также можете подключить элементы в TreeView, приведя их к TreeViewItem, как предложено, и затем вы можете подключиться к различным событиям манипуляции, таким как:

var item = tv.SelectedItem as TreeViewItem;
item.Expanded += item_Expanded;

А затем делайте все, что вам нужно сделать в обработчике событий

void item_Expanded(object sender, RoutedEventArgs e)
{
// handle your stuff
}
0 голосов
/ 04 марта 2011

У меня очень мало опыта работы с WPF на данный момент, поэтому я не уверен на 100%.Однако вы можете проверить метод .HitTest как Treeview, так и TreeView Item (WPF Treeview - это, по сути, Windows.Controls.Treeview, да? Или его производная?).

Метод HIt Test не всегда автоматически появляется в меню Intellisense для стандартного Windows.Forms.Treeview (я использую VS 2008), пока вы не введете большую часть имени метода.Но это должно быть там.Возможно, вам придется экспериментировать.

Вы можете использовать метод .HitTest для обработки события MouseDown и возврата ссылки на выбранный элемент древовидной структуры.Вы должны проверить на нулевой возврат, однако, в случае использования щелчков в области элемента управления, которая не содержит элементов дерева.Получив ссылку на конкретный элемент, вы сможете установить его свойство .expanded равным обратному тому, чем оно является в данный момент.опять же, некоторые эксперименты могут быть необходимы здесь.

Как я уже сказал, я на самом деле еще не использовал WPF, поэтому я мог бы получить это неправильно.,.

...