gpt4 book ai didi

silverlight - Accordion 项目的视觉状态不正确

转载 作者:行者123 更新时间:2023-12-04 07:02:30 24 4
gpt4 key购买 nike

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

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

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

如果我使用 AccordionItems 在按钮单击上动态添加 Accordion ,它可以正常工作。下面是我的示例应用程序。

那么我需要做什么才能让 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计数= 0;
公共(public)主页()
{
//需要初始化变量
初始化组件();
//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 );
}

}

最佳答案

如果您查看 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 是一个私有(private)变量,因此最好的办法是确定要在哪个状态中添加控件,然后告诉控件进入该状态(没有转换) 在将其添加到可视化树之前。这就是为什么 MouseOver 正在“修复”它。

关于silverlight - Accordion 项目的视觉状态不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1628557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com