2013-04-18 2 views
1

2 개의 시각적 상태가있는 단추 컨트롤이 있습니다. "Simple"과 "Complex"라고 말하십시오. 전자는 기본값입니다. 처음에는 컨트롤이 숨겨져 있습니다.컨트롤이 보이지 않을 때 시각 상태가 변경되지 않습니다.

내가 VisualStateManager을 통해 시각적 상태를 설정하는 경우에 ("복잡한"나는 false를 얻을 수 있지만, 내가 볼 한 번 다음 컨트롤을 시각적 상태를 설정할 때, 그것은 true를 반환하고 상태가 유지됩니다 후에도 컨트롤이 보이지 않게 됨) 컨트롤이 적어도 한 번 표시되면 문제가됩니다. 그렇다면 시각적 상태 변화가 존중되고 그렇지 않으면 한 번 표시 될 때까지 항상 무시됩니다.

아직 보이지 않는 컨트롤의 시각적 상태를 어떻게 설정합니까? 뒤에

<Grid x:Name="LayoutRoot" 
     Background="LightBlue"> 
    <Grid.Resources> 
    <Style x:Key="MyButton" 
      TargetType="Button"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
      <Grid> 
       <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="MyStates"> 
        <VisualState x:Name="Simple" /> 
        <VisualState x:Name="Complex"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ellipse" 
                Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> 
         <DiscreteObjectKeyFrame KeyTime="10" 
               Value="#00000000" /> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <Ellipse x:Name="ellipse" 
         Fill="#FF0E0EF5" 
         Stroke="Black" /> 
       <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
      </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </Grid.Resources> 
    <Button x:Name="btnStuff" 
      Content="Click Me!" 
      Visibility="Collapsed" 
      Style="{StaticResource MyButton}" /> 
    <StackPanel> 
    <Button x:Name="btnShow" 
      Content="Show" 
      Click="btnShow_Click" /> 
    <Button x:Name="btnVisual" 
      Content="Visual Change" 
      Click="btnVisual_Click" /> 
    </StackPanel> 
</Grid> 

코드 :

bool fOriginalState = true; 

    private void btnShow_Click(object sender, RoutedEventArgs e) 
    { 
     btnStuff.Visibility = btnStuff.Visibility == Windows.UI.Xaml.Visibility.Visible ? Windows.UI.Xaml.Visibility.Collapsed : Windows.UI.Xaml.Visibility.Visible; 
    } 

    private void btnVisual_Click(object sender, RoutedEventArgs e) 
    { 
     string visualState = fOriginalState ? "Complex" : "Simple"; 
     fOriginalState = !fOriginalState; 
     bool fSet = VisualStateManager.GoToState(btnStuff, visualState, false); 
     System.Diagnostics.Debug.WriteLine(fSet.ToString()); 
    } 
+0

처음에는'btnStuff'이 축소되어 페이지에 표시되지 않는다고 생각합니다. 따라서 'VisualStateManager'는 버튼을 찾을 수 없습니다. 일단 보이게하고 붕괴하면 UI 요소 트리의 일부가 될 수 있습니다. 나는이 일에 대해 확신하지 못한다. – Xyroid

+0

보기의 ctor에 단추의 초기 상태를 설정 했습니까? – Jehof

+0

@Jehof : 아니요, XAML에서 가시성이 축소되도록 설정되었습니다. – legends2k

답변

3

MSDN은 says

초기보기를 설정하기 위해로드 핸들러에서 VisualStateManager.GoToState 방법 를 호출하는 것이 적절하다 상태는 입니다.

FrameworkElement.Loaded 이벤트 핸들러 페이지에 있습니다. 그러나 Visibility="Collapsed"이 XAML에 하드 코딩 된 경우 여기에서 필요한 시각적 상태를 설정하면 무시됩니다.

컨트롤의 Visibility이 앱 시작 부분에서 Collapsed으로 바로 설정되었을 때이 문제가 발생하는 이유가 있습니다. 그러면로드되지 않습니다. 런타임 중에 속성이 Visible으로 설정 될 때까지 지연됩니다. 일단 그것이 설정되면,로드되고, 컨트롤을 VisualTree에 나타나게합니다. 시각적 트리에 나타나기 전에 컨트롤에 대한 시각적 상태 변경 요청은 무시됩니다.

내가 발견 한 해결 방법은 컨트롤을 XAML에서 Collapsed으로 설정하지 않는 것입니다. 컨트롤이 표시되기 때문에로드되고로드 된 이벤트 처리기에서 VisibilityCollapsed으로 설정할 수 있습니다. 컨트롤이 이미 VisualTree에 있으므로 VSM.GotoState에 대한 모든 호출이 적용됩니다.

호프가 나를 좋아하는 사람에게 도움이되기를 바랍니다.

관련 문제