2013-07-08 23 views
6

Ho un'applicazione con un treeview e una casella di testo:TreeView Problema con espansione elemento non selezionato

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

Nel costruttore di applicazione a generare 1000 elementi, ciascuno con 1 sub-elemento e aggiungo 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); 
    } 
} 

Nel mio scenario, ho selezionare la seconda voce del TreeView, quindi fare clic nella casella di testo per prendere fuoco lontano dal TreeView. Quindi scorro il TreeView con il mouse, portando l'elemento selezionato fuori dal viewport. Quindi espongo un altro oggetto senza selezionarlo. Il mio risultato atteso è che il mio scroll rimanga nella sua posizione corrente, ma invece fa scorrere l'elemento selezionato di nuovo in vista, facendomi perdere l'oggetto che stavo espandendo.

Ciò non si verifica se TreeView ha già lo stato attivo. Se dovessi selezionare un oggetto, quindi scorrere verso il basso ed espandere un altro elemento, questo comportamento di saltare indietro all'elemento selezionato non avverrà.

È normale? Ad esempio, se eseguo gli stessi passaggi di selezione in Esplora soluzioni di Visual Studio, non ho questo tipo di comportamento. C'è un modo per dirgli di non tornare all'elemento selezionato come questo?

Capisco che posso semplicemente impostare e.Handled di RequestBringIntoView su true, tuttavia il campione che sto dando è solo una semplice spiegazione del mio problema. Questo è un esempio di un problema con TreeView che sto utilizzando in un'applicazione molto più grande in cui desidero che l'elemento venga visualizzato in determinate condizioni.

+0

Ho appena provato in VS 2012, e si comporta come si descrive. Se sto rinominando un file, tornerà all'elemento selezionato in precedenza. Se non sto modificando il nome del file, lo scorrimento è invariato. –

+2

Hai provato ad aggiungere eventi/comportamenti al tuo TreeView per qualcosa come TreeViewItem.RequestBringIntoView o TreeViewItem.Expanded e selezionando il nuovo oggetto o permettendogli di andare all'elemento precedente a seconda del criterio che hai scelto? – Vynos

risposta

4

Il problema è correlato al concetto di ambito logico denominato FocusScope.

quello che vuoi è impostare IsFocusScope per il vostro TreeView su true:

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

Ecco un articolo su di esso http://www.codeproject.com/Articles/38507/Using-the-WPF-FocusScope

Ecco l'.net 4.5 doc per esso: http://msdn.microsoft.com/en-us/library/aa969768.aspx Come si spiega meglio di me e che potrebbe essere più aggiornato di codeproject articolo

+0

Funziona sicuramente, ma tieni presente che l'impostazione di un FocusScope può avere altre conseguenze per cose come il comando WPF a cui bisogna prestare attenzione. –