Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Пренаправление событий


Автор: RastaDja 26.3.2012, 16:23
   Доброго времени суток.
   Суть задачи - создать список (ListBox), эдементы которого можна сворачивать (использую Expander). Внутри этих елементов вложен контрол (обертка над http://www.codeproject.com/Articles/17097/WPF-Chart-Control-With-Pan-Zoom-and-More). 
   Проблема заключается в том, что контрол реагирует на нажатие кнопок мыши. При встраивание его в шаблон, контрол не реагирует на нажатие левой кнопки мыши (нажатие правой работает). Насколько я правильно понял, Expander перехватил событие нажатия левой кнопки, но решить данную проблему я не умею.
   Подскажите, пожалуйста, как сделать так, чтоб на события нажатия реагировал мой контрол, а не Expander.

   
Код

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sp ="clr-namespace:org.WPF.View;assembly=org.WPF.View"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>       
        <DataTemplate x:Key="ListTmpl">
            <Expander BorderThickness="2" Margin="2" BorderBrush="Black" FontFamily="Calibri" >
                <!-- <Expander FontFamily="Calibri" >-->
                <Expander.Header>
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                       
                    </Grid>
                </Expander.Header>
                <Expander.Content>

                    <DockPanel Margin="4">
                       <!--  ВОТ МОЙ КОНТРОЛ. Именно он не реагирует на нажатие лев. кноп. мышки -->
                        <sp:Viewer Primitives="{Binding Data}" Height="200" VerticalAlignment="Top"></sp:Viewer>
                     
                    </DockPanel>

                </Expander.Content>
            </Expander>
        </DataTemplate>
    </Window.Resources>
    <Grid>
       
        <StackPanel>
            <ListBox ScrollViewer.CanContentScroll="False" Name="list" VerticalContentAlignment="Stretch"  HorizontalContentAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto"  ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemTemplate="{StaticResource ListTmpl}"/>
        </StackPanel>
    </Grid>
</Window>


Спасибо.

Автор: ababab 27.3.2012, 08:06
Код

<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="350"
        Width="525">
    <Window.Resources>
        <DataTemplate x:Key="ListTmpl">
            <Expander BorderThickness="2"
                      Margin="2"
                      BorderBrush="Black"
                      FontFamily="Calibri">
                <!-- <Expander FontFamily="Calibri" >-->
                <Expander.Header>
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.RowDefinitions>
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                    </Grid>
                </Expander.Header>
                <Expander.Content>
                    <DockPanel Margin="4">
                        <Button Content="123" />
                    </DockPanel>
                </Expander.Content>
            </Expander>
        </DataTemplate>
    </Window.Resources>
    <Grid>

        <StackPanel>
            <ListBox ScrollViewer.CanContentScroll="False"
                     Name="list"
                     VerticalContentAlignment="Stretch"
                     HorizontalContentAlignment="Stretch"
                     ScrollViewer.VerticalScrollBarVisibility="Auto"
                     ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                     ItemTemplate="{StaticResource ListTmpl}" />
        </StackPanel>
    </Grid>
</Window>


Кнопка фокусится и нажимается.

Попробуйте IsHitTestVisible="False" для родительских вашему контролу контейнеров (Expander, DockPanel, etc).

Автор: RastaDja 27.3.2012, 08:52
Цитата(ababab @  27.3.2012,  09:06 Найти цитируемый пост)
Кнопка фокусится и нажимается.

Да, кнопка нажимается, а мой крнтрол не реагирует на нажатие левой кнопки. При чем, это только в шаблоне, если его разместить на форму - все нормально.
Цитата(ababab @  27.3.2012,  09:06 Найти цитируемый пост)
Попробуйте IsHitTestVisible="False" для родительских вашему контролу контейнеров (Expander, DockPanel, etc). 

В этом случае блокируются все нажатия моего контрола. Это не помогает. (ах да. нужно не только нажимать, но и тянуть за левую кнопку мышки).

Автор: RastaDja 27.3.2012, 09:34
нашлось решение, это оказалось пузырьковой маршрутизацией события.
Код

private void SpViewer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)