3

я определил стили для ListBox для отображения элементов с вертикальной или горизонтальной ориентацией прокрутки:Динамического изменения ориентации ListBox со стилем

<Style x:Key="ListBoxVerticalStyle" TargetType="ListBox"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="Padding" Value="0"/> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="ListBoxHorizontalStyle" TargetType="ListBox"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="Padding" Value="0"/> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

они работают хорошо, когда статический используются в XAML, например,

<ListBox Style="{StaticResource ListBoxHorizontalStyle}" ... 

Я пытаюсь обновить ориентацию динамически в C# с этим кодом:

if (horizontal) 
{ 
    MyListBox.Style = Resources["ListBoxHorizontalStyle"] as Style; 
} 
else 
{ 
    MyListBox.Style = Resources["ListBoxVerticalStyle"] as Style; 
} 
MyListBox.InvalidateMeasure(); 
MyListBox.InvalidateArrange(); 

ListBox.ScrollViewer ориентация делает изменения, однако элементы остаются укладываются в их исходной ориентации. Как будто обновление ItemsPanel не применяется. Есть ли что-то, что мне нужно сделать, чтобы заставить ListBox полностью обновиться?

ответ

1

Я не думаю, что он поднимает событие PropertyChange, когда вы это делаете. В верхней части головы у меня только два решения. Один из них вывел собственный пользовательский ListBox и VisualStates, что далеко не так долго, как решение здесь. Другой вариант довольно прост, нам просто нужно сообщить, что свойство изменилось, и самый простой способ, которым я знаю, как это сделать, - это просто привязать его к ViewModel.

Для этого, я просто хочу, чтобы использовать страницу как ViewModel, так что ваш XAML походит так


<ListBox x:Name="myListBox"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="{Binding MYO}"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

C#

using System.ComponentModel; // INotifyPropertyChanged 

public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged 
{ 
    // implement the INotify 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (null != handler) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent();   
    } 

    private System.Windows.Controls.Orientation _myo; 
    public System.Windows.Controls.Orientation MYO 
    { 
     get { return _myo; } 
     set { _myo = value; NotifyPropertyChanged("MYO"); } 
    } 

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     myListBox.DataContext = this;       // have to set the datacontext to point to the page 
     MYO = System.Windows.Controls.Orientation.Horizontal; // set it to Horizontal 
     // MYO = System.Windows.Controls.Orientation.Vertical; // set it to Vertical 
    } 
} 
+0

Спасибо, я добавил свойство ориентации в мою модель представления, и он работает. Мне показалось, что я придумал что-то удобное со стилями, но я думаю, что это не сработает. – UrbanMetro

Смежные вопросы