none
有关VisualStateManager的问题 RRS feed

  • 问题

  • 1.可以在xaml中使用代码改变控件元素的z轴顺序吗?我目前只知道可以在视图设计器上右键元素设置(如置顶)。

    2.请问该如何实现下面的效果呢?

    <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"/> <VisualState x:Name="PointerOver">

    if(Checked) <Storyboard1/>

    else()<Storyboard2/>

    </VisualStateGroup>

    <VisualStateGroup x:Name="CheckStates">
    <VisualState x:Name="Checked">
    <Storyboard>
    <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckGlyph"/>
    </Storyboard>
    </VisualState>
    <VisualState x:Name="Unchecked"/>
    <VisualState x:Name="Indeterminate"/>
    </VisualStateGroup>

    ... </VisualStateManager.VisualStateGroups>

    我需要让一个Radio button在选中和未选中时的pointerover和pressed状态有不同的外观。

    3.VisualStateGroup的Name属性可以随意设置吗?还是只能CheckStates,CommonStates,FocusStates这三种?目前只看到这三种。如果还有其他的种类,请问我该在哪里查询使用方法呢?

    谢谢。期待答复!

    2012年5月3日 3:54

答案

  • 1. Metro的XAML中,只有Canvas提供了一 Canvas.ZIndex 附加属性,所以我们将我们需要改变Z轴顺序的元素放入同一个Canvas面板中,然后在XAML中设置其Canvas.ZIndex值即可。

        <Canvas Background="{StaticResource ApplicationPageBackgroundBrush}">
            <Rectangle Fill="Green" Width="100" Height="200" Canvas.ZIndex="10"/>
            <Rectangle Fill="Red" Width="200" Height="100" Canvas.ZIndex="9"/>
        </Canvas>

    2. 那就需要分别给出四个状态,不用太在意这四个状态所在的 VisualStateGroup ,然后你在这个RadioButton的相关事件中调用 VisualStateManager.GoToState(radionbutton, "xxxx", true); 这个方法让按钮进入到相应的状态。你可以在 PointerEntered 事件中判断选中状态,然后进入相应的State。

    不过推荐的做法是,设计一个TemplatedControl继承自RadioButton,然后在这个TemplatedControl的模板中把你的状态写好

    (把你在Blend中导出的模板复制到你的Generic.xaml中,做相应修改,即可作为继承RadioButton的CustomContorl的默认模板,然后你就可以增加你的状态到其中)

    这样TemplatedControl自己的OnPointEnter等重载中写入你的VisualState的方法:

    protected override void OnPointerEntered(PointerEventArgs e) { base.OnPointerEntered(e); if (this.IsChecked == true) VisualStateManager.GoToState(this, "xxx", true); else VisualStateManager.GoToState(this, "xxx", true); } protected override void OnPointerPressed(PointerEventArgs e) { base.OnPointerPressed(e); if (this.IsChecked == true) VisualStateManager.GoToState(this, "xxx", true); else VisualStateManager.GoToState(this, "xxx", true); }

    为C#代码,如果你是C++,做相类似的变化就行了。

    3. 可以随你使用名字,这些名字只是其控件本身的源码中,一些过度效果中写死了,所以们在修改其模板的时候,要用其对应的,否则会无效。如果是一个完全自定义的控件,那么你可以随意使用你要的名字,然后在代码中控制其状态的变换。

    系统提供的控件,我们都可以通过Blend来修改模板,他的导出模板中你也能看到其本身已经写好的这些名字:

    例如,我要修改Button的模板,则可以在Blend中右击控件,然后 Edit Template -> Edit a Copy, 在可视设计器中修改或者XAML编辑器中修改。在可视设计其中,States列出了所有状态:

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月4日 4:57
    版主