アコーディオンアイテムが正しい視覚状態にない
-
06-07-2019 - |
質問
アコーディオンを使用して、作成中のLOBアプリケーションの合計を表示する必要があります。
アコーディオンをXAMLに配置すると、すべて正常に機能し、アイコンの状態(>)は正しく、右を指します。マウスがAccordionItemに入ると、視覚的状態は変化しません 。
(非同期データ呼び出しの戻りをシミュレートするために)ボタンクリックでAccordionItemsを動的に追加した場合、アイコンの状態は同じではなく、MouseEnterで「修正」されます。視覚的な状態変更を実行することにより、それ自体。 *「3つのアコーディオンアイテムを追加」をクリックする必要がある場合があります。 2回。
AccordionItemsを使用してButtonクリックにアコーディオンを動的に追加すると、正常に機能します。以下は私のサンプルアプリケーションです。
では、実行時に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にバインドできますか?