来自XAML的ListBox ScrollIntoView

时间:2014-04-10 18:24:34

标签: c# wpf xaml listbox

我使用StoryBoard为ListBox的SelectedIndex设置动画。

    <Storyboard x:Key="FlipBook" RepeatBehavior="Forever">
        <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="(Selector.SelectedIndex)" Storyboard.TargetName="FlipBookView">
            <EasingInt32KeyFrame KeyTime="0" Value="0"/>
            <EasingInt32KeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingInt32KeyFrame KeyTime="0:0:2" Value="0"/>
        </Int32AnimationUsingKeyFrames>
    </Storyboard>

当SelectedIndex发生变化时,我希望ListBox自动(并立即)滚动到该项目。

我相信ListBox。ScrollIntoView将完全按照我的意愿行事,但我需要在SelectedIndex更改时自动触发它。

这可能吗?

1 个答案:

答案 0 :(得分:2)

我要做的是使用Behaviors创建System.Windows.Interactivity。您必须在项目中手动引用它。

给定一个不会公开SelectedItems的控件,例如(ListBox,DataGrid)

您可以创建类似这样的行为类

public class ListBoxSelectedItemsBehavior : Behavior<ListBox>
{
    protected override void OnAttached()
    {
        AssociatedObject.SelectionChanged += AssociatedObjectSelectionChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= AssociatedObjectSelectionChanged;
    }

    void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Assuming your selection mode is single.
        AssociatedObject.ScrollIntoView(e.AddedItems[0]);
    }

XAML Binding我会i这样xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" behaviorsBehavior<ListBox> <i:Interaction.Behaviors> <behaviors:ListBoxSelectedItemsBehavior/> </i:Interaction.Behaviors> </ListBox> 的命名空间类

DataContext

假设ListBox的{​​{1}}在SelectedItems中有ViewModel属性,则会自动更新SelectedItems。你已经封装了从event订阅的View,即

<ListBox SelectionChanged="ListBox_SelectionChanged"/>

如果需要,您可以将Behavior类更改为DataGrid类型。