0


0

Telerik WPF RadCarouselのキーボードナビゲーション

Telerik WPF RadCarouselのキーボードナビゲーションに少し苦労しています。 アイテムの外側で、カルーセルコントロール内をクリックすると、キーボードナビゲーションが期待どおりに機能します(左右のキーボード矢印を使用してアイテムを切り替えることができます)が、RadCarousel内のアイテムをクリックすると、キーボードナビゲーションがなくなります。 カルーセルのアイテムにフォーカスがあるときに、RadCarouselでキーボードナビゲーションを処理するにはどうすればよいですか?

私が達成したい追加事項:

  1. SelectedItemを「フロントアイテム」として自動的に表示します カルーセル。

  2. をナビゲートするときに自動的に「フロントアイテム」を選択します カルーセル。

RadCarouselバインディングは次のように設定されています。


編集する

Snoopを使用すると、スクロールが機能しているときに「CarouselScrollViewer」にフォーカスがあることがわかります。 アイテムを選択すると、RadCarouselがフォーカスを取得します(ナビゲーションが機能しなくなります)。

1 Answer


0


最も重要なのは、キーボードナビゲーションと、選択したアイテムをカルーセルの前面に移動することです。

  1. キーボードナビゲーション:

    private void Carousel_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        CarouselScrollViewer scrollViewer = FindChild(this.carousel, null);
    
    
    scrollViewer.Focus();

    +} public static T FindChild(DependencyObject parent、string childName)where T:DependencyObject \ {// parentとchildNameが有効であることを確認します。 if(parent == null)nullを返す;

T foundChild = null;


int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < 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<T>(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 && 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;

+ } . 選択したアイテムをカルーセルの中心に移動:

+

private void Carousel_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
    this.carousel.BringDataItemIntoView(this.carousel.CurrentItem);
}