powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Scrolling
14 сообщений из 14, страница 1 из 1
Scrolling
    #39698167
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в следующем. Имею кусок кода, который показывает коллекцию данных. Каждый элемент этой коллекции отображается внутри DataGrid с помощью шаблона содержащего кучу TextBlock-ов и TextBox-ов
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<ScrollViewer>
...
  <DataGrid>
    ...
    <TextBlock ... />
    <TextBlock ... />
    <TextBox ... />
    ...
  </DataGrid>
...
</ScrollViewer>


Модератор: для оформления xml-а есть [srс xml]
При скроллировании этого набора колесом мышки все работает нормально до тех пор пока мышка не остановится над TextBox-ом. С этого места скроллинг (колесом мышки) не работает. Если сдвинуть мышь на TextBlock, то скроллирование нормально работает.
Как это побороть?
...
Рейтинг: 0 / 0
Scrolling
    #39698181
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем там текстбоксы? У DataGrid есть режим редактирования, в него и надо втыкать текстбокс, а для просмотра использовать текстблоки
...
Рейтинг: 0 / 0
Scrolling
    #39698188
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я привел "обезжиренный" кусок кода, чтобы показать саму суть проблемы. TextBox находится не в самом DataGrid, а "зарыт" гораздо глубже.
...
Рейтинг: 0 / 0
Scrolling
    #39698190
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм
ну попробуй <TextBox VerticalScrollBarVisibility="Disabled">
...
Рейтинг: 0 / 0
Scrolling
    #39698191
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помогло. В процессе прокрутки, как только мышь наезжает на это поле, то прокрутка останавливается.
...
Рейтинг: 0 / 0
Scrolling
    #39698192
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо придется убирать TextBox-ы до момента редактирования.
...
Рейтинг: 0 / 0
Scrolling
    #39698193
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
странно, у тебя и над TextBlock -ми не должно скроллиться.
Вот мой рабочий вариант, когда нужно игнорировать скролл над элементами:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    public sealed class IgnoreMouseWheelBehavior : Behavior<UIElement>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel;
            base.OnDetaching();
        }

        void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (!e.Handled)
            {
                e.Handled = true;

                var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                e2.RoutedEvent = UIElement.MouseWheelEvent;
                AssociatedObject.RaiseEvent(e2);
            }

        }
    }



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
<ScrollViewer>
            <DataGrid Width="100">
                <i:Interaction.Behaviors>
                    <local:IgnoreMouseWheelBehavior/>
                </i:Interaction.Behaviors>
                
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBox   Text="Textbox" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
                <TextBlock Text="Textblock2" />
            </DataGrid>
        </ScrollViewer>
        
...
Рейтинг: 0 / 0
Scrolling
    #39698306
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Над TextBlock-ами почему-то скроллинг работает.

Пример я не очень понял. Тут показано как игнорировать скроллинг над DataGrid, а мне нужно все тоже самое, но наоборот.

Осложняет ситуацию то, что, как я уже сказал, TextBox находится не в самом DataGrid, а "зарыт" гораздо глубже.
DataGridRowDetail( DataGridRowDetail( DataGridRowDetail( ListBox( ... TextBlock-и, TextBox-ы ...)) ) )
Но, тем не менее, все что на этих уровнях находится не мешает скроллированию, а вот с TextBox-ми просто беда какая-то.
Ладно, спасибо за обсуждение. Буду искать обходные пути.
...
Рейтинг: 0 / 0
Scrolling
    #39698384
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй переопределить обработку событий мышки, либо задай параметр IsHitTestVisible=False
...
Рейтинг: 0 / 0
Scrolling
    #39698420
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я попробовал применить Behavior (как указано в примере) - не помогло.
Но, я проследил цепочку событий для MouseWheel (тунельные - Preview и всплывающие).
Даже когда на каком-то уровне Behavior ставит e.Handled = true, то тунельное событие все равно
проходит по всей ветке элементов до самого низа (с этим самым Handled = true) - т.е. движение вниз не прерывается.
Видимо это происходит из-за того что в
AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
присутствует еще и старый обработчик, который тоже продолжает выполнятся.
Поэтому, событие Wheel обслуживают "все кому не лень" (хотя при Handled = true не должны этого делать)

По поводу " IsHitTestVisible=False" буду пробовать.
...
Рейтинг: 0 / 0
Scrolling
    #39698447
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXЯ попробовал применить Behavior (как указано в примере) - не помогло.
Но, я проследил цепочку событий для MouseWheel (тунельные - Preview и всплывающие).
Даже когда на каком-то уровне Behavior ставит e.Handled = true, то тунельное событие все равно
проходит по всей ветке элементов до самого низа (с этим самым Handled = true) - т.е. движение вниз не прерывается.
Видимо это происходит из-за того что в
AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
присутствует еще и старый обработчик, который тоже продолжает выполнятся.
Поэтому, событие Wheel обслуживают "все кому не лень" (хотя при Handled = true не должны этого делать)

По поводу " IsHitTestVisible=False" буду пробовать.
любое маршрутизируемое событие будет всплывать, даже если задать Handled=true. Создайте свой класс, наследуйте его от TextBox и переопределите эту логику
...
Рейтинг: 0 / 0
Scrolling
    #39698473
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes любое маршрутизируемое событие будет всплывать
Это понятно.
Я говорю, что с момента когда на некотором элементе ставится Handled=true событие продолжает "спускаться" вниз по дереву в дочерние узлы (уже с признаком Handled=true), а уж потом по этой же цепочке всплывает вверх (туда откуда пришло).
По идее признак handled=true должен исключить обработку в "нижних узлах", но он как-то ее не исключает :-(
...
Рейтинг: 0 / 0
Scrolling
    #39698618
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
попробуйте применить поведение IgnoreMouseWheelBehavior для всех элементов Вашего шаблона DataGrid(от верхнего элемента в визуальном дереве к нижнему).
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        <ScrollViewer>
            <DataGrid Width="100">
                <i:Interaction.Behaviors>
                    <local:IgnoreMouseWheelBehavior/>
                </i:Interaction.Behaviors>
                
                <TextBlock Text="Textblock1" />
                <TextBlock Text="Textblock2" />
                <TextBox   Text="Textbox" >
                    <i:Interaction.Behaviors>
                        <local:IgnoreMouseWheelBehavior/>
                    </i:Interaction.Behaviors>
                </TextBox>
                <TextBlock Text="Textblock1" />
              
            </DataGrid>
        </ScrollViewer>
...
Рейтинг: 0 / 0
Scrolling
    #39698803
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я потренировался на простых примерах - "IgnoreMouseWheelBehavior" работает как положено.
Только в моем реальном проекте, где большое наслоение всего на всем, что-то не везде получается.
Видимо есть какие-то тонкости, которые мне придется "ловить" самому.
Спасибо за обсуждение темы.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Scrolling
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]