[WPF] DoubleClick всплывает по дереву TreeView
От: dmitry_npi Россия  
Дата: 13.03.10 11:07
Оценка:
Я строю программно TreeView, добавляя в него элементы. Каждому элементу программно назначаю обработчик двойного щелчка. При двойном щелчке на элементе, который является вложенным, событие происходит (и вызывается обработчик) для него и всех его родителей.

e.Handled = true не помогает, в мсдн так и сказано.

В интернете нормального решения не нашёл. Неужели остается заводить свой флаг и проверять его? Это же костыль.

Кто разбирается, расскажите, почему сделано именно так, и как это правильно обойти.
Атмосферная музыка — www.aventuel.net
Re: [WPF] DoubleClick всплывает по дереву TreeView
От: Codechanger Россия  
Дата: 13.03.10 11:48
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>Я строю программно TreeView, добавляя в него элементы. Каждому элементу программно назначаю обработчик двойного щелчка. При двойном щелчке на элементе, который является вложенным, событие происходит (и вызывается обработчик) для него и всех его родителей.


_>e.Handled = true не помогает, в мсдн так и сказано.


_>В интернете нормального решения не нашёл. Неужели остается заводить свой флаг и проверять его? Это же костыль.


_>Кто разбирается, расскажите, почему сделано именно так, и как это правильно обойти.


Control authors who want to handle mouse double clicks should use the MouseLeftButtonDown event when ClickCount is equal to two. This will cause the state of Handled to propagate appropriately in the case where another element in the element tree handles the event.
Re[2]: [WPF] DoubleClick всплывает по дереву TreeView
От: dmitry_npi Россия  
Дата: 14.03.10 08:02
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Control authors who want to handle mouse double clicks should use the MouseLeftButtonDown event when ClickCount is equal to two. This will cause the state of Handled to propagate appropriately in the case where another element in the element tree handles the event.


Да MSDN-то я читал, и делать так пробовал.
Так еще хуже — событие MouseLeftButtonDown не обрабатывается вообще. В обработчик не заходит. Вот мой код (тестовый):


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

            <TreeViewItem Header="Root1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown">
                <TreeViewItem Header="Child1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown">
                    <TreeViewItem Header="SubChild1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown" >

                    </TreeViewItem>
                </TreeViewItem>
            </TreeViewItem>

        </TreeView>
    </Grid>
</Window>



private void TreeViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Trace.WriteLine("Left Button Down");
}



Что я делаю не так?
Атмосферная музыка — www.aventuel.net
Re[3]: [WPF] DoubleClick всплывает по дереву TreeView
От: MxKazan Португалия  
Дата: 14.03.10 14:25
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Здравствуйте, Codechanger, Вы писали:


C>>Control authors who want to handle mouse double clicks should use the MouseLeftButtonDown event when ClickCount is equal to two. This will cause the state of Handled to propagate appropriately in the case where another element in the element tree handles the event.


_>Да MSDN-то я читал, и делать так пробовал.

_>Так еще хуже — событие MouseLeftButtonDown не обрабатывается вообще. В обработчик не заходит. Вот мой код (тестовый):
Ага, хренотень какая-то. Скорее всего криво сделали TreeViewItem. WPF-ный TreeView вообще, конечно, полон загадок, к сожалению.

Что можно сделать. Если MouseDoubleClick возникает во всем дереве, то это, как минимум, позволяет использовать только один обработчик, приатаченный к рутовому узлу дерева. В этом обработчике можно взять e.OriginalSource и пройтись от него по родителям, используя VisualTreeHelper, а встретив TreeViewItem, принять решение, что двойной клик произвели именно на нем. Да, решение не самое приятное, но что поделать.
Re[3]: [WPF] DoubleClick всплывает по дереву TreeView
От: Codechanger Россия  
Дата: 15.03.10 06:43
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Здравствуйте, Codechanger, Вы писали:


C>>Control authors who want to handle mouse double clicks should use the MouseLeftButtonDown event when ClickCount is equal to two. This will cause the state of Handled to propagate appropriately in the case where another element in the element tree handles the event.


_>Да MSDN-то я читал, и делать так пробовал.

_>Так еще хуже — событие MouseLeftButtonDown не обрабатывается вообще. В обработчик не заходит. Вот мой код (тестовый):


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

_>            <TreeViewItem Header="Root1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown">
_>                <TreeViewItem Header="Child1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown">
_>                    <TreeViewItem Header="SubChild1" MouseLeftButtonDown="TreeViewItem_MouseLeftButtonDown" >

_>                    </TreeViewItem>
_>                </TreeViewItem>
_>            </TreeViewItem>

_>        </TreeView>
_>    </Grid>
_></Window>
_>



_>
_>private void TreeViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
_>{
_>Trace.WriteLine("Left Button Down");
_>}
_>



_>Что я делаю не так?


Есть предложение сделать это все-таки на InputBindings и командах...
Re: [WPF] DoubleClick всплывает по дереву TreeView
От: alexey kur  
Дата: 17.03.11 09:29
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Я строю программно TreeView, добавляя в него элементы. Каждому элементу программно назначаю обработчик двойного щелчка. При двойном щелчке на элементе, который является вложенным, событие происходит (и вызывается обработчик) для него и всех его родителей.


_>e.Handled = true не помогает, в мсдн так и сказано.


_>В интернете нормального решения не нашёл. Неужели остается заводить свой флаг и проверять его? Это же костыль.


_>Кто разбирается, расскажите, почему сделано именно так, и как это правильно обойти.


...
TreeViewItem tviSender = sender as TreeViewItem;

if (tviSender.IsSelected)
DoAction();
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.