如何在滚动查看器中获取滚动条以在单击时聚焦滚动查看器?

时间:2010-10-28 03:58:15

标签: wpf

目前使用滚动查看器,单击其中包含的滚动条以平移其周围的内容将不会使查看器(或任何其他内容)聚焦。 我想通过拖动滚动滚动,甚至点击滚动条将聚焦父(滚动查看器)。

我通过在scrollviewer上附加ScrollChanged处理程序并调用sender.focus()来实现这一点。在初始化scrollviewer时调用ScrollChanged,然后加载

我也试过附上事件制定者,但仍然没有运气。

理想情况下,我希望在某种风格或某种东西上允许我将它应用于整个应用程序中的所有滚动查看器。

编辑:为了进一步澄清,如果我使用此xaml并单击滚动条,它将不会将背景变为蓝色(gotfocus事件)。当我点击滚动查看器或按钮时,它会。

<Window x:Class="GotFocusProblem.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">
    <Grid>
        <Grid Margin="20" x:Name="grid">
            <Grid.Background>
                <SolidColorBrush x:Name="backgrnd" Color="Transparent"/>
            </Grid.Background>
            <ScrollViewer Margin="10" Height="100" Background="#FFEEEEEE">
                <Button Content="Button" Name="button1" Height="300"  Width="75" />
            </ScrollViewer>
            <Grid.Triggers>
                <EventTrigger RoutedEvent="Grid.GotFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation
                            Storyboard.TargetName="backgrnd"
                            Storyboard.TargetProperty="Color"
                            To="Cyan"
                            BeginTime="0:0:0"
                            Duration="0:0:0" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Grid.Triggers>
        </Grid>
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:4)

我不是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 在xaml文件中添加x:Class属性,类似于

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>