如何在WPF列表视图中切换滚动锁定?

如何在WPF列表视图中切换滚动锁定?,wpf,listview,scroll,Wpf,Listview,Scroll,如何在WPF列表视图中切换滚动锁定 当将更多项目添加到列表视图中时,会出现以下情况,具体取决于滚动锁定状态 当启用滚动锁定时,列表视图在添加更多项目时不应滚动(这是默认行为) 当禁用滚动锁定时,列表视图应自动滚动到底部,以便用户可以看到新添加的项目 滚动锁定状态应由典型键盘上的(很少使用)“滚动锁定”按钮控制 编辑:一点代码 <ListView x:Name="logMessagesListView" ItemsSource="{Binding ElementName=self, Path

如何在WPF列表视图中切换滚动锁定

当将更多项目添加到
列表视图中时,会出现以下情况,具体取决于滚动锁定状态

  • 当启用滚动锁定时,
    列表视图在添加更多项目时不应滚动(这是默认行为)

  • 当禁用滚动锁定时,
    列表视图应自动滚动到底部,以便用户可以看到新添加的项目

  • 滚动锁定状态应由典型键盘上的(很少使用)“滚动锁定”按钮控制

    编辑:一点代码

    <ListView x:Name="logMessagesListView" ItemsSource="{Binding ElementName=self, Path=LogMessages}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Created" Width="100" DisplayMemberBinding="{Binding Created}"/>
                    <GridViewColumn Header="Level" Width="80" DisplayMemberBinding="{Binding LogLevel}"/>
                    <GridViewColumn Header="Message" Width="350" DisplayMemberBinding="{Binding Message}"/>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    
    
    
    ScrollViewer.CanContentScroll=“False”
    放在XAML中,这样应该可以工作了

    对于自动UI通知和CollectionChanged事件,我会将日志消息保存在ObservableCollection中。添加新项目后,检查按钮是否已单击。如果是,则移动到最后一项(或者可以使用事件参数的索引/项属性)

    您需要将System.Windows.Forms添加到项目引用中,以便检查按钮状态

    public partial class MainWindow : Window
    {
        private ObservableCollection<LogMessage> logMessages;
    
        public MainWindow()
        {
            this.logMessages = new ObservableCollection<LogMessage>();
    
            /* add/load some data */
    
            this.logMessages.CollectionChanged += new NotifyCollectionChangedEventHandler(this.LogMessages_CollectionChanged);
    
            this.LogMessages = CollectionViewSource.GetDefaultView(this.logMessages);
    
            InitializeComponent();
        }
    
        public ICollectionView LogMessages
        {
            get;
            set;
        }
    
        private void LogMessages_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                if (System.Windows.Forms.Control.IsKeyLocked(System.Windows.Forms.Keys.Scroll))
                {
                    this.LogMessages.MoveCurrentToLast();
                }
            }
        }
    }
    
    public class LogMessage
    {
        public string Created
        { get; set; }
    
        public string LogLevel
        { get; set; }
    
        public string Message
        { get; set; }
    }
    
    公共部分类主窗口:窗口
    {
    私有可观察收集日志消息;
    公共主窗口()
    {
    this.logMessages=新的ObservableCollection();
    /*添加/加载一些数据*/
    this.logMessages.CollectionChanged+=新的NotifyCollectionChangedEventHandler(this.logMessages\u CollectionChanged);
    this.LogMessages=CollectionViewSource.GetDefaultView(this.LogMessages);
    初始化组件();
    }
    公共ICollectionView日志消息
    {
    得到;
    设置
    }
    私有无效日志消息\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
    {
    if(e.Action==NotifyCollectionChangedAction.Add)
    {
    if(System.Windows.Forms.Control.IsKeyLocked(System.Windows.Forms.Keys.Scroll))
    {
    this.LogMessages.MoveCurrentToLast();
    }
    }
    }
    }
    公共类日志消息
    {
    已创建公共字符串
    {get;set;}
    公共字符串日志级别
    {get;set;}
    公共字符串消息
    {get;set;}
    }
    
    您能发布一个实际问题吗?否则,这将被关闭,因为您没有要求任何内容…问题在标题中,现在也在文本中。我看不出此属性设置为true或false在行为上有任何区别。在我设置“Enabled”之前,我的ListView中的滚动条被锁定“财产归真,谢谢。我使用
    if(Keyboard.GetKeyStates(Key.Scroll)!=KeyStates.Toggled)logMessagesListView.ScrollIntoView(logMessagesListView.Items.GetItemAt(LogMessages.Count-1)),修改了您的代码以避免引用表单取而代之。