Родительский элемент TreeView Призрачное выбранное событие! - PullRequest
4 голосов
/ 22 августа 2009

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

<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: Window { public 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)
    {

    }
}

}

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

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

Спасибо, Brette

Ответы [ 2 ]

2 голосов
/ 22 августа 2009

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

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

Надеюсь, это спасет кого-то еще.

Brette

0 голосов
/ 22 августа 2009

Добавить:

w.Owner = this      

Пример:

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