Изменение ItemsPanelTemplate ListBox во время выполнения - PullRequest
3 голосов
/ 17 ноября 2011

Я хотел бы, чтобы ListBox изменил ItemsPanelTemplate во время выполнения.

У меня есть следующий XAML, который позволяет мне изменять ItemsPanelTemplate; однако имеет нежелательный побочный эффект от поломки 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.

Может ли кто-нибудь дать представление об этой проблеме или, возможно, предложить обходной путь?

Спасибо.

* РЕДАКТИРОВАТЬ *

Итак, я сузил проблему до того, что она связана с виртуализацией. Если вы измените VirtualizingStackPanel только для обычной StackPanel, ScrollViewer не сломается. Для меня это не совсем решение, так как этот ListBox будет содержать сотни результатов поиска.

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Я думаю, что самый простой обходной путь - это заменить весь ListBox вместо просто шаблона панели.

0 голосов
/ 04 июля 2017

ну, я столкнулся с той же проблемой, я хотел создать ListBox, в котором есть продукты и который позволяет пользователю свободно менять макет с WrapPanel на список и с ListBox на WrapPanel.так что для этого вы должны использовать стили.(Я рекомендую вам использовать ListView, а не ListBox из-за проблем с прокруткой в ​​ListBox. В любом случае оба будут работать).сначала добавьте 2 стиля в в app.xaml

WrapPanelTemplateLV

<Style x:Key="WrapPanelTemplateLV" TargetType="ListView">
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>

и StackPanelTemplateLV

<Style x:Key="StackPanelLV" TargetType="ListBox">
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>

теперь внутри вашей кнопки просто сделайте это

// StackPanelLV is on my App.xaml
            MyListView.Style = (Style)Application.Current.Resources["StackPanelLV"];

и теперь у вас есть идея.сделайте логику для переключения между двумя стилями.Я рекомендую вам перейти к этому вопросу больше. Изменение стилей во время выполнения в WPF

...