24607


Windows10、VisualStudio2015、.Net4.6、WPF、C# で開発しております。

以下のように横方向にしたListBoxで項目を上下方向にドラッグすると数秒間操作を一切け付けない状態になってしまいます。どうやら内部でリストの先頭または終端までスクロールする処理を行っているようで、固まる時間は残りスクロール項目数に比例しています。

この現象を回避もしくは機能自体を停止したいのですが、どのようにしたら良いのでしょうか。

* * *

[![画像の説明をここに入力](https://i.stack.imgur.com/9ruCB.png)](https://i.stack.imgur.com/9ruCB.png)

MainWindow.xaml

[code]

    <Window x:Class="HorizontalListBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HorizontalListBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    
    <Grid>
        <ListBox x:Name="listbox" ItemsSource="{Binding Items}" VerticalAlignment="Center" Margin="100">
    
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Width="64" Height="64" Background="Orange" Padding="5" Text="{Binding .}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
    
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
    
        </ListBox>
    </Grid>
    </Window>
    
[/code]

MainWindow.xaml.cs

[code]

    using System.Collections.Generic;
    using System.Linq;
    using System.Windows;
    
    namespace HorizontalListBox
    {
        public partial class MainWindow : Window
        {
            public List<int> Items { get; } = Enumerable.Range(0, 1000).ToList();
    
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2016-05-06T07:40:55.523
24604
2016-05-06T09:22:22.577
2016-05-06T09:22:22.577
14817
14817
question
wpf
WPF 横方向にしたListBoxでアイテムを上下にドラッグすると数秒間操作不能になる


[`ItemsControl`の`DoAutoScroll`の呼び出しに起因する不具合](http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs,920)のように思われます。

`ListBox`は`ListBox.OnIsMouseCapturedChanged`でマウスの位置を監視するタイマーを起動し、マウス左ボタンをプレスしたままコントロール外に移動した場合は自動スクロールを行う実装になっているようです。  
しかし`ItemsPanel`が`Orientation`=`Horizontal`の場合、この仕様はマウスの垂直移動に対してうまく機能しておらず、(Virtualizing)StackPanelの末尾まで一気にスクロールしています。  
この結果、すべての要素の生成とレイアウトが一度に行われてフリーズしているのだと思われます。

対策としてはイベントまたはオーバーライドでマウスキャプチャをキャンセルするか、`ItemsPanel`を`UniformGrid`などのレイアウトがすぐ終わるパネルに変更することではないでしょうか。


CC BY-SA 3.0
2016-05-06T08:29:27.250
24607
2016-05-06T08:29:27.250
5750
24604
answer