올바른 시각적 상태가 아닌 아코디언 항목
-
06-07-2019 - |
문제
아코디언을 사용하여 우리가 구축하는 LOB 응용 프로그램에 총계를 표시해야합니다.
아코디언을 XAML에 배치하면 모든 것이 잘 작동하며 아이콘 상태 (>)가 정확하고 오른쪽을 가리키고 있습니다. 아코디언에 들어가는 마우스에서 ~ 아니다 시각적 상태 변화가 있습니다.
버튼에 아코디언스를 동적으로 추가하면 (비동기 데이터 통화 반환을 시뮬레이션하려면) 아이콘 상태는 동일하지 않으며 마우스 센터에서 시각적 상태 변경을 실행하여 자체를 "수정합니다. *"3 개의 아코디언 항목 추가"를 두 번 클릭해야 할 수도 있습니다.
아코디언 템으로 클릭 한 버튼에 아코디언을 동적으로 추가하면 잘 작동합니다. 아래는 내 샘플 응용 프로그램입니다.
그렇다면 런타임에 아코디언을 추가하고 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; 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 );
}
}
해결책
rectaccordion.updatelayout (); 항목을 추가 한 후 ...
다른 팁
Accordian Control의 소스 코드를 살펴보면 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 Control에서 내부로 표시되고 InteractionHelper는 개인 변수이므로 가장 좋은 방법은 제어를 추가하는 상태를 파악한 다음 해당 상태로 이동하도록 지시하는 것입니다 (전환없이 해당 상태로 이동하도록하십시오. ) 시각적 트리에 그것을 추가하기 전에. 이것이 마우스 오버가 "고정"하는 이유입니다.
AccorDian 항목을 관측형 수집에 바인딩 할 수 있습니까?