Silverlight中的VisualState继承

时间:2010-05-12 09:53:08

标签: silverlight visualstatemanager

我正在编写一个继承自RadioButton的控件,除了显示图像并隐藏默认圆圈之外,它没有做任何更精彩的事情。

我无法找到的一件事是,如果我必须在ControlTemplate中再次重新实现所有VisualStates,或者我可以简单地将它们作为空元素放置并且它们是继承的?

我的XAML位于the original RadioButton is on MSDN之下。

<Style TargetType="local:ImageRadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ImageRadioButton">
                <Grid>
                    <vsm:VisualStateManager.VisualStateGroups>
                        <vsm:VisualStateGroup x:Name="CommonStates">
                            <vsm:VisualState x:Name="Normal"/>
                            <vsm:VisualState x:Name="MouseOver">
                                <Storyboard/> <!-- mouseover -->
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Pressed" />
                            <vsm:VisualState x:Name="Disabled"/>
                            <!-- TODO -->
                        </vsm:VisualStateGroup>
                        <vsm:VisualStateGroup x:Name="CheckStates">
                            <vsm:VisualState x:Name="Checked">
                                <Storyboard/>
                                <!-- checked -->
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Unchecked"/>
                        </vsm:VisualStateGroup>

                        <vsm:VisualStateGroup x:Name="FocusStates">
                            <vsm:VisualState x:Name="Focused" />
                            <vsm:VisualState x:Name="Unfocused" />
                        </vsm:VisualStateGroup>
                        <vsm:VisualStateGroup x:Name="ValidationStates">
                            <vsm:VisualState x:Name="Valid"/>
                            <vsm:VisualState x:Name="InvalidUnfocused" />
                            <vsm:VisualState x:Name="InvalidFocused" />
                        </vsm:VisualStateGroup>
                    </vsm:VisualStateManager.VisualStateGroups>

                    <ContentPresenter/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

2 个答案:

答案 0 :(得分:3)

全有或全无。如果替换模板,则必须提供所有模板,包括可视状态。 Blend可以轻松编辑默认模板的副本。

答案 1 :(得分:2)

您没有 重新实现视觉状态,但它们也不会“继承”。如果为新控件指定新的DefaultStyleKey,则无法从原始样式中获得任何内容。

如果您希望新控件修改其外观以表示其当前状态,例如它是否具有焦点或是否已选择它,则需要包含适当的VisualStateGroups组。然后在VisualState元素中添加相应的动画,以更改按钮UI的新版本。