当控件不可见时,视觉状态不会改变

时间:2013-04-18 21:29:56

标签: c# xaml windows-store-apps winrt-xaml

我有一个按钮控件,它有2个视觉状态;说“简单”和“复杂”;前者是默认的。最初控件是隐藏的。

当我通过 VisualStateManager 将视觉状态设置为“Complex”时,我得到false,但是当我将控件显示一次然后设置视觉状态时,它返回{{ 1}}并且状态被保留(即使在控制变得不可见之后),即所有重要的是控制是否至少显示一次;如果是这样,视觉状态的变化会得到尊重,否则它会一直被忽略,直到它显示一次。

如何设置尚未显示的控件的可视状态?

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>

1 个答案:

答案 0 :(得分:3)

MSDN says

  

调用VisualStateManager.GoToState方法也是合适的   从一个Loaded处理程序,以设置一个初始视图状态   在模板中定义。

FrameworkElement.Loaded事件处理程序页面下;但是,如果在XAML中对Visibility="Collapsed"进行了硬编码,则此处设置所需的可视状态也会被忽略。

此问题背后的原因是,当控件的Visibility从应用程序的开头设置为Collapsed时。然后它永远不会被加载;在运行时将属性设置为Visible之前,它会延迟;一旦它被设置,然后它就会被加载,通过使控件出现在VisualTree中。在出现在可视树中之前,对控件的任何可视状态更改请求都会被忽略。

我发现的工作是不在XAML中将控件设置为Collapsed;因为控件是可见的,所以它被加载并且在加载的事件处理程序中,可以将Visibility设置为Collapsed,所有对VSM.GotoState的调用都会得到尊重,因为控件现在已经在VisualTree中了

希望这可以帮助那些正在寻找像我这样的解决方案的人。