1

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

当我通过VisualStateManager将视觉状态设置为“复杂”时,我得到falsetrue是控件是否至少显示一次;如果是这样,则尊重视觉状态更改,否则它总是被忽略,直到它显示一次。

如何为尚不可见的控件设置视觉状态?

<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());
    }
4

1 回答 1

3

MSDN

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

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

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

我发现的解决方法是不要Collapsed在 XAML 中设置控件;由于控件是可见的,它被加载并在加载的事件处理程序中,可以设置VisibilityCollapsed,所有对 VSM.GotoState 的调用都将得到尊重,因为控件现在已经在 VisualTree 中。

希望这可以帮助像我这样摸索解决方案的人。

于 2013-05-02T14:01:37.260 回答