Глобальный скролл прокручивается пока мышкой не попадаешь на область UserContol'a, у которого свой горизонтальный скролл. В итоге чтобы увидеть содержимое всего UserControl нужно докрутить наведя мышкой.
Вопрос: как прокручивать глобальный скролл вне зависимости от того в какой части указатель мыши? (Еще было бы замечательно, если ваш ответ был применим для MVVM)
<catel:DataWindow x:Class="VFL_catel.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:catel="http://catel.codeplex.com"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
<Grid Height="auto"
Background="#F6F8F8">
<ScrollViewer VerticalScrollBarVisibility="Auto" x:Name="ScrollViewerVerticalGlobal">
<WrapPanel Orientation="Horizontal">
<GroupBox Header="Турнирная таблица"
FontWeight="Bold">
<!-- Содержимое -->
</GroupBox>
<GroupBox Header="Серии"
FontWeight="Bold"
Visibility="{Binding ElementName=series, Path=IsChecked, Converter={catel:BooleanToCollapsingVisibilityConverter}}"
Background="#F6F8F8">
<!-- Содержимое -->
</GroupBox>
<GroupBox Header="Подробная информация"
MinWidth="400"
FontWeight="Bold"
Background="#F6F8F8">
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid>
<!-- Содержимое -->
</Grid>
</ScrollViewer>
</GroupBox>
</WrapPanel>
</ScrollViewer>
</Grid>
</catel:DataWindow>
Пробовал через Interaction, но тщетно.
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewMouseWheel"
SourceName="ScrollViewerVerticalGlobal"
SourceObject="{Binding ElementName=ScrollViewerVerticalGlobal}">
<catel:EventToCommand Command="{Binding ScrollHorizontalMouseWheel}"
DisableAssociatedObjectOnCannotExecute="False"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
Хорошо. Воспользуемся системой маршрутизируемых событий WPF.
Добавьте обработчик у верхнего ScrollViewer:
<ScrollViewer VerticalScrollBarVisibility="Auto"
x:Name="ScrollViewerVerticalGlobal"
PreviewMouseWheel="OnPreviewMouseWheel">
В обработчике напишите:
private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewerVerticalGlobal.ScrollToVerticalOffset(
ScrollViewerVerticalGlobal.VerticalOffset - e.Delta);
e.Handled = true;
}
Как вариант через рефлексию, команду и триггер.
Оговорка, использую фреймворк catel, у которого есть встроенный менеджер, но т.к. все примерно похоже переложить на свой фреймворк должно быть не трудно.
Разметка XAML
<ScrollViewer VerticalScrollBarVisibility="Auto"
x:Name="ScrollViewerVerticalGlobal">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewMouseWheel"
<catel:EventToCommand Command="{Binding ScrollVerticalMouseWheel}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<!-- content -->
</ScrollViewer>
Команда обработчик
public Command<MouseWheelEventArgs> ScrollVerticalMouseWheel { get; private set; }
private void OnScrollVerticalMouseWheelExecute(MouseWheelEventArgs eventArgs)
{
var scrollField = _view.GetType().GetFieldEx("ScrollViewerVerticalGlobal");
var scrollbar = scrollField.GetValue(_view) as ScrollViewer;
if (scrollbar == null) return;
scrollbar.ScrollToVerticalOffset(scrollbar.VerticalOffset - eventArgs.Delta);
eventArgs.Handled = true;
}
Где _view мой View полученный через сервисы фреймворка. Пример для catel.
Создаем объект команды в конструкторе ViewModel
ScrollVerticalMouseWheel = new Command<MouseWheelEventArgs>(OnScrollVerticalMouseWheelExecute);
Продвижение своими сайтами как стратегия роста и независимости