Как получить полосу прокрутки в окне просмотра прокрутки, чтобы фокусировать ее при нажатии? - PullRequest
3 голосов
/ 28 октября 2010

В настоящее время при просмотре прокрутки нажатие на полосу прокрутки, содержащуюся в ней, для панорамирования содержимого вокруг нее не будет фокусировать зрителя (или что-либо в этом роде). Я хочу, чтобы при прокрутке перетаскиванием прокрутки или даже нажатием на полосу прокрутки фокусировался родитель (средство просмотра прокрутки).

Я достиг этого несколько, подключив обработчик ScrollChanged к scrollviewer и вызвав sender.focus (). Unforutnally ScrollChanged вызывается при инициализации scrollviewer и так далее при загрузке

Я также попытался прикрепить сеттеры событий, но все еще не повезло.

В идеале мне бы хотелось, чтобы он был в каком-то стиле или что-то вроде, что позволяет мне применять его ко всем читателям прокрутки во всем приложении.

Редактировать: Просто для дальнейшего уточнения, если я использую этот 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 Ответ

4 голосов
/ 28 октября 2010

Я не уверен на 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...