我需要使用Accordion在我们正在构建的LOB应用程序上显示一些总计。

如果我将手风琴放在XAML中,一切正常,图标的状态(>)正确并且指向右侧。在鼠标进入AccordionItem时,我们有视觉状态变化。

如果我在按钮单击上动态添加AccordionItems(以模拟异步数据调用返回),则图标的状态不同,并且在MouseEnter上它“更正”。本身通过执行视觉状态变化。 *您可能需要点击“添加3个手风琴项目”。两次。

如果我在按钮上动态添加一个Accordion,请点击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

{       private int count = 0;   公共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 );
  }

}

有帮助吗?

解决方案

呼叫 TestAccordion.UpdateLayout(); 添加项目后......可能是

其他提示

如果您查看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“修复”的原因。它。

您可以将手风琴项目绑定到ObservableCollection吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top