2009-08-21 4 views
4

У меня есть TreeView, который запускает новое окно, когда каждый из его событий TreeViewItems Selected поднят.Parent TreeView Элемент, выбранный призраком!

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300"> 
<Grid> 
    <TreeView Name="treeView1"> 
     <TreeViewItem Header="Root"> 
      <TreeViewItem Header="Parent" Selected="ParentTreeViewItem_Selected"> 
       <TreeViewItem Header="Child" Selected="TreeViewItem_Selected" ></TreeViewItem> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 
</Grid> 
</Window> 

Код За

namespace WpfApplication1 

{ общественного частичного класса window1: Окно { общественного Window1() { InitializeComponent(); }

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 
     Window w = new Window(); 
     w.Show(); 
     e.Handled = true; 
    } 

    private void ParentTreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 

    } 
} 

}

Когда я нажимаю на дочерний узел новое окно запускается как и ожидалось. Как бы то ни было, последующие слова его родителей. Выбранные события запустили фокус фокуса из нового окна и отметили родительский узел как текущий выбор!

Мое предположение состояло в том, что новое окно будет иметь фокус, а узел, который был нажат, станет серым, указывая на выбор пользователей. Кто-нибудь знает, почему это происходит и как я могу это предотвратить?

Спасибо, Brette

ответ

2

Мысль я бы разместить ответ. Наконец я нашел способ обойти это. Установка w.Owner = this; не имеет никакого эффекта. Оказывается, запуск нового окна в выбранном событии TreeViewItem вызывает некоторые проблемы с фокусом. Я не выяснил, что является основной причиной этого, выполняя это на Диспетчере, похоже, исправляет его. См. Ниже

private void ChildTreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 
     Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => new Window().Show())); 
    } 

Надеюсь, что это сэкономит кому-то еще некоторое время.

Brette

+0

я нашел тот же вопрос при запуске его из IsSelected собственности сеттера в ViewModel в. Оттуда вы не можете использовать диспетчер, поэтому я использую это решение: http://stackoverflow.com/a/5971732/383129 – JoanComasFdz

0

Добавить:

w.Owner = this  

Пример:

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
{ 
    Window w = new Window(); 
    w.Owner = this; 
    w.Show(); 
    e.Handled = true; 
} 
Смежные вопросы