Клавиатура навигационная в Telerik WPF RadCarousel - PullRequest
0 голосов
/ 15 октября 2010

Я немного борюсь с навигацией с помощью клавиатуры в Telerik WPF RadCarousel.Если я щелкаю вне элемента, но в элементе управления каруселью, навигация с помощью клавиатуры работает должным образом (я могу переключаться между элементами с помощью стрелок влево и вправо), но если я щелкаю элемент в RadCarousel, навигация с помощью клавиатуры исчезает.Как я могу заставить RadCarousel обрабатывать навигацию с клавиатуры, когда элемент в карусели имеет фокус?

Дополнительные вещи, которые я хочу выполнить:

  1. Автоматически показывать SelectedItem как «front-»item "в карусели.
  2. Автоматически выбирайте" front-item "при навигации по карусели.

Моя привязка RadCarousel настраивается следующим образом:

    <ScrollViewer CanContentScroll="true">
        <telerik:RadCarousel Name="carousel" HorizontalScrollBarVisibility="Hidden" 
                             ItemsSource="{Binding Path=Templates}"
                             ItemTemplate="{StaticResource template}"
                             SelectedItem="{Binding Path=SelectedTemplateAndFolder}" />
    </ScrollViewer>

Редактировать:

Используя Snoop, я вижу, что «CarouselScrollViewer» имеет фокус, когда работает прокрутка.Выбор элемента приводит к тому, что RadCarousel получает фокус (и навигация перестает работать).

1 Ответ

0 голосов
/ 19 октября 2010

У меня получилось больше всего импортируемых вещей: навигация с помощью клавиатуры и перемещение выделенного элемента вперед к карусели.

  1. Навигация с клавиатуры:

    private void Carousel_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        CarouselScrollViewer scrollViewer = FindChild<CarouselScrollViewer>(this.carousel, null);
    
    
    <pre><code>scrollViewer.Focus();
    
    } public static T FindChild (DependencyObject parent, строка childName), где T: DependencyObject {// Подтверждение, что parent и childName допустимы.if (parent == null) return null;
    T foundChild = null;
    
    
    int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i &lt; childrenCount; i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        // If the child is not of the request child type child
        T childType = child as T;
        if (childType == null)
        {
            // recursively drill down the tree
            foundChild = FindChild&lt;T&gt;(child, childName);
    
    
            // If the child is found, break so we do not overwrite the found child. 
            if (foundChild != null) break;
        }
        else if (!string.IsNullOrEmpty(childName))
        {
            var frameworkElement = child as FrameworkElement;
            // If the child's name is set for search
            if (frameworkElement != null &amp;&amp; frameworkElement.Name == childName)
            {
                // if the child's name is of the request name
                foundChild = (T)child;
                break;
            }
        }
        else
        {
            // child element found.
            foundChild = (T)child;
            break;
        }
    }
    
    
    return foundChild;
    
    }
  2. Перемещение выбранного элемента в центр карусели:

    private void Carousel_SelectionChanged(object sender, SelectionChangeEventArgs e)
    {
        this.carousel.BringDataItemIntoView(this.carousel.CurrentItem);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...