0

如何在 WPF ListView 中切换滚动锁定?

当更多的项目被添加到 aListView时,根据滚动锁定状态,应该会发生以下情况。

  1. 启用滚动锁定后,添加更多项目时ListView不应滚动(这是默认行为)。

  2. 当滚动锁定被禁用时,ListView应该自动滚动到底部,以便用户可以看到新添加的项目。

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

编辑:一些代码......

<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>
4

2 回答 2

1

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

您需要将 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; }
}
于 2012-06-28T11:13:43.793 回答
0

放入ScrollViewer.CanContentScroll="False"您的 XAML,这应该可以工作!

于 2012-06-28T10:18:42.497 回答