2013-07-08 19 views
6

Mam aplikacji z katalogów i pola tekstowego:TreeView Problem z rozszerza non-wybrany element

<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> 

w konstruktorze dla aplikacji wygenerować 1000 elementów, każdy z 1 podpunktu i dodać go do 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); 
    } 
} 

W moim scenariuszu I wybrać drugą pozycję w TreeView, a następnie kliknij w polu tekstowym do podjęcia skupić od TreeView. Następnie przewijam w dół TreeView za pomocą myszki, usuwając wybrany element z okna podglądu. Następnie rozwijam inny element bez jego zaznaczania. Moim oczekiwanym rezultatem jest to, że mój scroll pozostaje w aktualnej pozycji, ale zamiast tego przewija wybrany przedmiot z powrotem do widoku, powodując utratę powiększanego przedmiotu.

Nie występuje, jeśli TreeView ma już fokus. Gdybym miał wybrać przedmiot, a następnie przewinąć w dół i rozwinąć kolejną pozycję, to takie zachowanie powrotu do wybranego elementu nie nastąpi.

Czy to normalne zachowanie? Jeśli wykonam te same kroki wyboru w eksploratorze rozwiązań Visual Studio, na przykład, nie otrzymam tego rodzaju zachowania. Czy jest jakiś sposób, aby powiedzieć, aby nie przewijać z powrotem do wybranego elementu?

Rozumiem, że mogę po prostu ustawić wartość e.Handled w RequestBringIntoView na wartość true, jednak próbka, którą podaję, jest prostym wyjaśnieniem mojego problemu. Jest to przykład problemu z TreeView, którego używam w znacznie większej aplikacji, w której chcę, aby przedmiot był wyświetlany pod pewnymi warunkami.

+0

Po prostu próbowałem go w VS 2012, i zachowuje się tak, jak opisujesz. Jeśli zmieniam nazwę pliku, nastąpi powrót do poprzednio wybranego elementu. Jeśli nie edytuję nazwy pliku, przewijanie pozostanie niezmienione. –

+2

Czy próbowałeś dodawać zdarzenia/zachowania do swojego TreeView w przypadku czegoś takiego jak TreeViewItem.RequestBringIntoView lub TreeViewItem.Expanded i wybierając nowy element lub pozwalając mu przejść do poprzedniego elementu w zależności od wybranych kryteriów? – Vynos

Odpowiedz

4

Problem dotyczy koncepcji zakresu logicznego o nazwie FocusScope.

Co chcesz jest ustawiony IsFocusScope do TreeView true:

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

Oto artykuł o tym http://www.codeproject.com/Articles/38507/Using-the-WPF-FocusScope

Oto .net 4.5 doc do niego: http://msdn.microsoft.com/en-us/library/aa969768.aspx Jak wyjaśnia jest lepszy niż ja i który może być bardziej aktualny niż artykuł kodowy projektu

+0

To zdecydowanie działa, ale należy pamiętać, że ustawienie FocusScope może mieć inne konsekwencje dla takich rzeczy, jak polecenia WPF, na które trzeba zwrócić uwagę. –