我有一个按钮控件,它有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>
答案 0 :(得分:3)
MSDN says
调用VisualStateManager.GoToState方法也是合适的 从一个Loaded处理程序,以设置一个初始视图状态 在模板中定义。
在FrameworkElement.Loaded
事件处理程序页面下;但是,如果在XAML中对Visibility="Collapsed"
进行了硬编码,则此处设置所需的可视状态也会被忽略。
此问题背后的原因是,当控件的Visibility
从应用程序的开头设置为Collapsed
时。然后它永远不会被加载;在运行时将属性设置为Visible
之前,它会延迟;一旦它被设置,然后它就会被加载,通过使控件出现在VisualTree中。在出现在可视树中之前,对控件的任何可视状态更改请求都会被忽略。
我发现的工作是不在XAML中将控件设置为Collapsed
;因为控件是可见的,所以它被加载并且在加载的事件处理程序中,可以将Visibility
设置为Collapsed
,所有对VSM.GotoState的调用都会得到尊重,因为控件现在已经在VisualTree中了
希望这可以帮助那些正在寻找像我这样的解决方案的人。