我需要使用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 );
}
}
答案 0 :(得分:2)
如果您查看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 :(得分:1)
呼叫 TestAccordion.UpdateLayout(); 添加项目后......可能是
答案 2 :(得分:0)
您可以将手风琴项目绑定到ObservableCollection吗?