recorrer - properties.settings c#
Cambiar los elementos de ListBoxPanelTemplate en tiempo de ejecuciĆ³n (2)
Creo que la solución más fácil sería reemplazar todo ListBox en lugar de solo la plantilla del panel.
Me gustaría que el ItemsPanelTemplate de ListBox cambie durante el tiempo de ejecución.
Tengo el siguiente XAML que me permite cambiar ItemsPanelTemplate; sin embargo, tiene el efecto secundario no deseado de romper el 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>
Cuando cambia la ElementsPanelTemplate de esta manera. El ScrollViewer parece permanecer en el estado en el que estaba antes de que lo haya cambiado y el uso de la barra de desplazamiento no afecta a ningún cambio en el ListBox.
¿Alguien puede proporcionar alguna información sobre este tema o tal vez proporcionar una solución alternativa?
Gracias.
* EDIT *
Entonces, reduje el problema hasta que esté relacionado con la virtualización. Si cambia el VirtualizingStackPanel solo por un StackPanel normal, el ScrollViewer no se rompe. Esta no es realmente una solución para mí, ya que este ListBox tendrá muchos cientos de resultados de búsqueda.
Bueno, me enfrentaba al mismo problema. Quería crear un ListBox que tuviera productos y hacer que el usuario pudiera cambiar el diseño de WrapPanel a List box y de ListBox a WrapPanel. así que para hacer esto debes usar estilos. (Le recomiendo que use ListView no ListBox debido a problemas de desplazamiento en ListBox. De todos modos ambos funcionarán). al principio agregue sus 2 estilos dentro en tu 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>
y 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>
ahora dentro de tu botón solo haz esto
// StackPanelLV is on my App.xaml
MyListView.Style = (Style)Application.Current.Resources["StackPanelLV"];
y ahora tienes la idea. hacer un poco de lógica para cambiar entre los 2 estilos. Te recomiendo que vayas a esta pregunta para obtener más información. Cambiar los estilos en tiempo de ejecución en WPF