Есть следующий XAML
код:
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Parents}"
RowDetailsVisibilityMode="VisibleWhenSelected"
ScrollViewer.CanContentScroll="False">
<DataGrid.Columns>
<DataGridTextColumn Width="*"
Binding="{Binding Name}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<!-- Если IsEnabled установить в True, прокрутка для дочерних записей работать не будет -->
<DataGrid AutoGenerateColumns="False"
IsEnabled="False"
ItemsSource="{Binding Children}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
Данная таблица умеет отображать дочерние записи для каждой родительской строки. Т.е. когда мы выделяем какую-нибудь из родительских строк - в качестве деталей этой строки отображаются дочерние записи. При этом, используя колесо мыши мы можем осуществлять прокрутку (scroll) по дочерним записям.
Суть проблемы
Как можно заметить у DataGrid
, который отображает дочерние записи, свойство IsEnabled
установлено в False
, при таких настройках прокрутка по дочерним записям с помощью колеса мыши работает. Но как только свойство IsEnabled
я устанавливаю в True
прокрутка с помощью колеса мыши по дочерним записям работать перестает, а нужно что бы работала.
Прошу помочь.
Проблема заключается в том что, когда курсор мыши находится над DataGrid
с дочерними элементами и начинается прокрутка колесика мыши, то генерируется туннелируемое событие PreviewMouseWheel
и для того чтобы таблица прокрутилась необходимо чтобы пришел ответ (пузырьковое событие - MouseWheel
). Ответ по каким-то причинам у вас не приходит.
Решение заключается в том, чтобы перехватить событие PreviewMouseWheel
и сгенерировать ответ событие - MouseWheel
:
Установите "System.Windows.Interactivity v4.0 for WPF" из NuGet. Добавьте пространство имен:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Собственно логика перехватывания и генерирования ответа при помощи Behavior:
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)
{
e.Handled = true;
var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
e2.RoutedEvent = UIElement.MouseWheelEvent;
AssociatedObject.RaiseEvent(e2);
}
}
теперь применение:
<DataGrid AutoGenerateColumns="False"
IsEnabled="True"
ItemsSource="{Binding Children}">
<i:Interaction.Behaviors>
<local:IgnoreMouseWheelBehavior/>
</i:Interaction.Behaviors>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
ПриветствуюМожно ли использовать перечисление StringSplitOptions
Допустим есть форма на сайте, в нее вбивается телефон, затем по нажатию кнопки на указанный номер отправляется сообщение
Есть текст "myservercom/?download_file=41&wccc_key_email=email&key=key" Как получить из всего этого только значение после "/?download_file" ? В моем случае это 41
В диспетчере задач есть такой столбец "Пользователь" где пишется от кого запущен, админ или пользв, как вывести это? Пока что я смог только...