2009-10-27 51 views
2

我需要使用Accordion在我们正在构建的LOB应用程序上显示一些总数。手风琴项目不正确视觉状态

如果我将手风琴置于XAML中,所有工作都正常,并且图标(>)的状态正确并指向右侧。在鼠标进入AccordionItem时,我们做了而不是有一个视觉状态变化。

如果我在Button Click上动态添加AccordionItems(模拟异步数据调用返回),图标的状态是不一样的,在MouseEnter上,它通过执行视觉状态更改来“纠正”自身。 *您可能需要点击两次“添加3个手风琴项目”。

如果我在Button上动态添加一个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 

{ 私人诠释计数= 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); 
    } 

}

回答

1

致电 TestAccordion.UpdateLayout(); 添加项目后...可能是

+0

这似乎使它看起来很好。 – 2011-11-15 03:41:31

2

如果你看一看的手风琴控制,你会看到它使用了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" }); 
    } 
} 

由于该方法被标记在手风琴控制内部和InteractionHelper为私有变量,最好的办法是要弄清楚该国的你在添加控件,然后告知控制去将其添加到视觉树中之前(没有过渡)。这就是为什么MouseOver“修复”它。

+0

你是如何去找出控件的源代码的?这非常有帮助。而且没有办法改变它? – JeroenEijkhof 2010-07-08 20:14:36

0

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

+0

似乎不能。 – 2011-11-15 03:45:13

+0

他停了一下(两年)...... ;-) – 2011-11-21 15:20:06