3

実行時に ListBox の ItemsPanelTemplate を変更したいと思います。

ItemsPanelTemplate を変更できる次の XAML があります。ただし、ScrollViewer を壊すという望ましくない副作用があります。

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ie="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"

...

<UserControl.Resources>
    <ItemsPanelTemplate x:Key="StackPanelTemplate">
        <VirtualizingStackPanel/>
    </ItemsPanelTemplate>

    <ItemsPanelTemplate x:Key="WrapPanelTemplate">
        <telerik:RadWrapPanel/>
    </ItemsPanelTemplate>
</UserControl.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <StackPanel>
        <Button Content="StackPanel">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ie:ChangePropertyAction TargetName="TargetListBox" PropertyName="ItemsPanel" Value="{StaticResource StackPanelTemplate}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
        <Button Content="WrapPanel">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ie:ChangePropertyAction TargetName="TargetListBox" PropertyName="ItemsPanel" Value="{StaticResource WrapPanelTemplate}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
    </StackPanel>

    <ListBox x:Name="TargetListBox" Grid.Column="1" ItemsSource="{Binding SomeCollection}"/>
</Grid>

このように ItemsPanelTemplate を変更すると。ScrollViewer は、変更前の状態にとどまっているように見えます。スクロール バーを使用しても、ListBox に変更はありません。

誰でもこの問題に関する洞察を提供したり、回避策を提供したりできますか?

ありがとうございました。

* 編集 *

そのため、問題を仮想化に関連するものに絞り込みました。通常の StackPanel の VirtualizingStackPanel を変更しても、ScrollViewer は壊れません。ただし、この ListBox には何百もの検索結果が保持されるため、これは実際には解決策ではありません。

4

2 に答える 2

1

最も簡単な回避策は、パネル テンプレートだけでなく、ListBox 全体を置き換えることだと思います。

于 2011-11-17T03:02:39.817 に答える