Элемент Аккордеона не в правильном визуальном состоянии

StackOverflow https://stackoverflow.com/questions/1628557

  •  06-07-2019
  •  | 
  •  

Вопрос

Мне нужно использовать Аккордеон для отображения некоторых итогов в LOB-приложении, которое мы создаем.

Если я помещаю Аккордеон в XAML, все работает нормально, и состояние значка (>) правильное и указывает вправо.При вводе мыши в AccordionItem мы делаем не измените визуальное состояние.

Если я динамически добавляю AccordionItems при нажатии кнопки (для имитации возврата асинхронного вызова данных), состояние значка не совпадает, и при MouseEnter он "исправляет" себя, выполняя визуальное изменение состояния.* Возможно, вам потребуется дважды нажать "Добавить 3 элемента аккордеона".

Если я динамически добавляю Аккордеон при нажатии кнопки с помощью AccordionItems, это работает нормально.Ниже приведен мой пример приложения.

Итак, что мне нужно сделать, чтобы заставить Accordion добавлять AcordionItems во время выполнения и находиться в правильном состоянии, как при использовании XAML?

XAML

 <Grid x:Name="LayoutRoot" Background="Black" >
  <StackPanel x:Name="TheStackPanel">
     <Button Content="Create Accordion" Click="CreateAccordionItems"></Button>
     <Button Content="Add 3 Accordion Items" Click="AddAccordionItems"></Button>
     <Grid Background="Pink">
        <layoutToolkit:Accordion SelectionMode="ZeroOrMore" x:Name="TestAccordion" Margin="10,10,10,10" HorizontalAlignment="Stretch"  >
           <layoutToolkit:AccordionItem Content="Content - 1" Header="Header - 1">
           </layoutToolkit:AccordionItem>
           <layoutToolkit:AccordionItem Content="Content - 2" Header="Header - 2">
           </layoutToolkit:AccordionItem>
           <layoutToolkit:AccordionItem Content="Content - 3" Header="Header - 3">
           </layoutToolkit:AccordionItem>
        </layoutToolkit:Accordion>
     </Grid>
  </StackPanel>

 public partial class MainPage : UserControl

{ количество частных входов = 0;общедоступная главная страница() { // Требуется для инициализации переменных InitializeComponent();//TestAccordion.Направление расширения = ExpandDirection.Вниз;}

  private void AddAccordionItems( object sender, RoutedEventArgs e )
  {
     AddToAccordion( 3, TestAccordion );
  }

  private void AddToAccordion( int size, Accordion _Accordion )
  {
     for( int i = 0; i < size; i++ )
     {
        AccordionItem accordionItem = new AccordionItem( );
        accordionItem.Header = "Item " + count.ToString( );
        count++;
        _Accordion.Items.Add( accordionItem );
        Grid aGrid = new Grid( );
        TextBlock tb = new TextBlock( );
        tb.Text = accordionItem.Header as string;
        aGrid.Children.Add( tb );
        accordionItem.Content = aGrid;
        //accordionItem.IsEnabled = true;
        accordionItem.IsSelected = true;
     }
  }

  private void CreateAccordionItems( object sender, RoutedEventArgs e )
  {
     Accordion accordion = new Accordion( );
     accordion.HorizontalContentAlignment = HorizontalAlignment.Stretch;
     TheStackPanel.Children.Add( accordion );
     AddToAccordion( 10, accordion );
  }

}

Это было полезно?

Решение

Вызовите TestAccordion.Описание обновления();после добавления элементов...может быть

Другие советы

Если вы взглянете на исходный код элемента управления Accordian, вы увидите, что он использует InteractionHelper.UpdateVisualState для установки его правильного состояния после событий.

public void UpdateVisualStateBase(bool useTransitions)
{
    if (!this.Control.IsEnabled)
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "Disabled", "Normal" });
    }
    else if (this.IsReadOnly)
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "ReadOnly", "Normal" });
    }
    else if (this.IsPressed)
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "Pressed", "MouseOver", "Normal" });
    }
    else if (this.IsMouseOver)
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "MouseOver", "Normal" });
    }
    else
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "Normal" });
    }
    if (this.IsFocused)
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "Focused", "Unfocused" });
    }
    else
    {
        VisualStates.GoToState(this.Control, useTransitions, new string[] { "Unfocused" });
    }
}

Поскольку метод помечен как внутренний в элементе управления Accordian, а InteractionHelper является частной переменной, лучше всего выяснить, в какое из состояний вы добавляете элемент управления, а затем сообщить элементу управления перейти в это состояние (без перехода), прежде чем добавлять его в визуальное дерево.Вот почему наведение курсора мыши "исправляет" это.

Можете ли вы привязать элементы accordian к ObservableCollection?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top