Я не уверен на 100%, что вы ищете здесь, но добавление этого кода в ваш пример заставит ScrollViewer получить фокус при нажатии, перетаскивании ScrollBar и т. Д. Для этого решения требуется некоторый код позади.
<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
<EventSetter Event="PreviewMouseDown" Handler="scrollBar_PreviewMouseDown"/>
</Style>
И в коде позади
void scrollBar_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
c_scrollViewer.Focus();
}
ОБНОВЛЕНИЕ
Вы можете знать, как добавить это в словарь ресурсов, чтобы вы могли получить к нему доступ длянесколько ScrollViewers, иначе вот как вы можете это сделать.
Добавьте словарь ресурсов в ваш проект.Я назвал свой ScrollBarStyles.xaml.
Добавьте для него код класса, называемый ScrollBarStyles.xaml.cs.
Добавьте атрибут x: Class в файл xaml, что-то вроде
x:Class="YourNameSpace.ScrollBarStyles"
ScrollBarStyles.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="FocusScrollViewer.ScrollBarStyles">
<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
<EventSetter Event="PreviewMouseDown" Handler="scrollBar_PreviewMouseDown"/>
</Style>
</ResourceDictionary>
ScrollBarStyles.xaml.cs
public partial class ScrollBarStyles
{
public T GetVisualParent<T>(object childObject) where T : Visual
{
DependencyObject child = childObject as DependencyObject;
// iteratively traverse the visual tree
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}
void scrollBar_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ScrollBar scrollBar = sender as ScrollBar;
ScrollViewer scrollViewer = GetVisualParent<ScrollViewer>(scrollBar);
scrollViewer.Focus();
}
}
Ваше окно
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ScrollBarStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>