考虑使用visual states - 这是专为你所谈论的,那种场景,你有一个控件,需要在多个州之间转换。通过绑定使用这种方法的一个好处是,它允许您使用动画(包括转换)。
得到它的工作,你申报你的视觉状态组,并可视状态,你控制的根元素下面:
<UserControl>
<Grid x:Name="LayoutRoot">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="DefaultStates">
<VisualState x:Name="State1" />
<VisualState x:Name="State2">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="textBlock2"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" To="Visible" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="textBlock1" Text="state #1" />
<TextBlock x:Name="textBlock2" Text="state #2" Visibility="Collapsed" />
</Grid>
</UserControl>
在状态之间转换,你可以调用VisualStateManager.GoToState(this, "State2", true)
。您还可以使用Blend SDK通过XAML的触发器进行转换。可能是过渡的最有效的方法,就是用DataStateBehavior
,结合状态的视图模型属性:
<Grid x:Name="LayoutRoot">
<i:Interaction.Behaviors>
<ei:DataStateBehavior Binding="{Binding CurrentState}"
Value="State2"
TrueState="State2" FalseState="State1" />
</i:Interaction.Behaviors>
这样你可以更新您的视图模型的属性,而UI状态将更新自动。
public string File
{
get { return _file; }
set
{
_file = value;
RaisePropertyChanged();
RaisePropertyChanged(() => CurrentState);
}
}
private string _file;
public string CurrentState
{
get { return (File == null ? "State1" : "State2"); }
}
通过'BoolToVisibilityConverter' ,你的意思是推出我自己的,或者在.NET中使用'BooleanToVisibilityConverter'? – 2014-09-05 21:07:16
@TheodorosChatzigiannakis滚你自己的。 'BooleanToVisibilityConverter'只是转换为Collapsed/Visible,iirc,所以它不是非常有用和可重用的。 – Athari 2014-09-05 21:08:57
您的建议帮助我更好地理解了XAML和CLR对象之间的关系,并向我展示了如何编写可重用转换器。我想我会用这个解决方案。 – 2014-09-05 21:30:36