Наследование VisualState в Silverlight

Я пишу элемент управления, который наследуется от RadioButton и не делает ничего более впечатляющего, чем отображение изображения и скрытие круга по умолчанию.

Одна вещь, о которой я не смог узнать, - это то, что мне придется заново реализовать все VisualStates в моем ControlTemplate, или я могу просто поместить их как пустой элемент, и они унаследованы?

Мой XAML находится ниже, исходный RadioButton находится на 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>

person Chris S    schedule 12.05.2010    source источник


Ответы (2)


Вам не нужно повторно реализовывать визуальные состояния, но они также не будут "унаследованы". Если вы укажете новый DefaultStyleKey для нового элемента управления, вы ничего не получите от исходного стиля.

Если вы хотите, чтобы ваш новый элемент управления изменил свой внешний вид, чтобы представить свое текущее состояние, например, имеет ли он фокус или он выбран, вам нужно будет включить соответствующий набор VisualStateGroups. Затем включите в элементы VisualState соответствующие анимации, чтобы изменить новую версию пользовательского интерфейса кнопки.

person AnthonyWJones    schedule 12.05.2010
comment
Есть ли смысл включать пустые элементы <vsm:VisualState x:Name="Pressed" />, <vsm:VisualState x:Name="Disabled"/> и т. Д.? - person Chris S; 12.05.2010

Все или ничего. Если вы заменяете шаблон, вы должны предоставить его все, включая визуальные состояния. Blend позволяет легко редактировать копию шаблона по умолчанию.

person Bruno Martinez    schedule 12.05.2010