【问题标题】:ListBox ScrollIntoView from XAML来自 XAML 的 ListBox ScrollIntoView
【发布时间】:2014-04-10 18:24:34
【问题描述】:

我正在使用 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 更改时自动触发。

这可能吗?

【问题讨论】:

    标签: c# wpf xaml listbox


    【解决方案1】:

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

    给定一个不公开 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,其中ixmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"behaviorsBehavior 类的命名空间

    <ListBox>
     <i:Interaction.Behaviors>
        <behaviors:ListBoxSelectedItemsBehavior/>
     </i:Interaction.Behaviors>
    </ListBox>
    

    假设您的ListBoxDataContextViewModel 中具有SelectedItems 属性,那么它将自动更新SelectedItems。您已经封装了从View 订阅的event,即,

    <ListBox SelectionChanged="ListBox_SelectionChanged"/>
    

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

    【讨论】:

    • 这会提供滚动到 SelectionChanged 事件视图中的任何内容吗?我已经完成了以下操作,但希望尽可能不使用代码隐藏:private void SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { ListBox FlipBook = ((sender as ListBox) as ListBox); FlipBook.ScrollIntoView(FlipBook.SelectedItem); }
    • 这不是您的View 中的代码。它是在您的View 中声明的对象,它与事件处理程序一起封装。根据我的经验,行为是将事件附加到 ViewModel 的最简洁方式,无需使用像 Caliburn.Micro 这样的第三方框架
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多