Аккордеонный предмет не в правильном визуальном состоянии - PullRequest
2 голосов
/ 27 октября 2009

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

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

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

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

Итак, что мне нужно сделать, чтобы Аккордеон добавил 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

{ private int count = 0; public MainPage () { // Требуется для инициализации переменных InitializeComponent (); //TestAccordion.ExpandDirection = ExpandDirection.Down; }

  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 );
  }
* *} Тысяча двадцать-один

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

Если вы посмотрите на исходный код элемента управления 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 является частной переменной, лучше всего выяснить, в какое из состояний вы добавляете элемент управления, а затем указать элементу управления перейти в это состояние ( без перехода) перед добавлением его в визуальное дерево. Вот почему MouseOver «исправляет» это.

1 голос
/ 14 декабря 2009

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

0 голосов
/ 14 декабря 2009

Можете ли вы связать аккордеонные элементы с коллекцией ObservableCollection?

...