2013-07-08 3 views
6

У меня есть приложение с TreeView и текстовым полем:TreeView Проблемы с расширением невыбранной пункта

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="550" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <TreeView Width="500" Height="500" Name="TestTreeView"> 

     </TreeView> 
     <TextBox Grid.Row="1"></TextBox> 
    </Grid> 
</Window> 

В конструкторе для приложения I генерировать 1000 элементов, каждый из которых с 1 подпунктом и добавить его в TreeView:

public MainWindow() 
{ 
    InitializeComponent(); 

    for (int i = 0; i < 1000; i++) 
    { 
     TreeViewItem item = new TreeViewItem(); 
     item.Header = "Hey there " + i.ToString(); 
     TreeViewItem subItem = new TreeViewItem(); 
     subItem.Header = "Hi there"; 
     item.Items.Add(subItem); 
     TestTreeView.Items.Add(item); 
    } 
} 

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

Этого не происходит, если TreeView уже имеет фокус. Если бы я должен был выбрать элемент, тогда прокрутите вниз и разверните еще один элемент, это поведение перехода к выбранному элементу не произойдет.

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

Я понимаю, что я могу просто установить e.Handled из RequestBringIntoView в true, однако образец, который я даю, просто объясняет мою проблему. Это пример проблемы с TreeView, которую я использую в гораздо большем приложении, где я хочу, чтобы элемент был введен в поле зрения при определенных условиях.

+0

Я просто попробовал это в VS 2012, и он ведет себя так, как вы описываете. Если я переименую файл, он вернется к ранее выбранному элементу. Если я не редактирую имя файла, свиток не изменяется. –

+2

Вы пытались добавить события/поведение в TreeView для чего-то вроде TreeViewItem.RequestBringIntoView или TreeViewItem.Expanded и либо выбрать новый элемент, либо позволить ему перейти к предыдущему элементу в зависимости от того, какие критерии вы выбрали? – Vynos

ответ

4

Проблема связана с концепцией логического охвата под названием FocusScope.

Что вы хотите, чтобы установить IsFocusScope для TreeView к истине:

<TreeView Width="500" Height="500" Name="TestTreeView" FocusManager.IsFocusScope="true"> 
</TreeView> 

Вот статья об этом http://www.codeproject.com/Articles/38507/Using-the-WPF-FocusScope

Вот это .net 4.5 док для него: http://msdn.microsoft.com/en-us/library/aa969768.aspx Как объясняет это лучше, чем я могу, и который может быть более актуальным, тогда статья кодекса

+0

Это определенно работает, но имейте в виду, что установка FocusScope может иметь другие последствия для таких вещей, как команда WPF, на которую нужно обратить внимание. –

Смежные вопросы