0

WPF ListViewでスクロールロックを切り替えるには?

表示するスペースよりも多くのアイテムが に追加されるListViewと、スクロール ロックの状態に応じて次のようになります。

  1. スクロール ロックが有効ListViewになっている場合、アイテムを追加するときにスクロールしません (これがデフォルトの動作です)。

  2. スクロール ロックが無効ListViewになっている場合、新しく追加された項目がユーザーに表示されるように、自動的に一番下までスクロールする必要があります。

スクロール ロックの状態は、一般的なキーボードの (めったに使用されない) 'scroll lock' ボタンで制御する必要があります。

編集:少しのコード...

<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

自動 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; }
}
于 2012-06-28T11:13:43.793 に答える
0

XAMLScrollViewer.CanContentScroll="False"を挿入すると、動作するはずです。

于 2012-06-28T10:18:42.497 に答える