GoToState не работает на элементе управления пользователя на основе combobox - PullRequest
1 голос
/ 06 сентября 2010

Я пытаюсь создать пользовательский комбинированный список, который показывает анимацию загрузки, когда для него установлено свойство bool (например, IsLoading).

Я создал шаблон элемента управления в Blend на основе комбинированного списка и добавил текстовый блок внутри шаблона кнопки-переключателя. В коде позади я вызываю VisualStateManager.GoToState, но он всегда возвращает false. Сначала я пытался перейти в пользовательское состояние, но даже не могу перейти в такие состояния, как Disabled или MouseOver.

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

Я в растерянности относительно того, как отладить это, поскольку ошибок нет.

спасибо

1 Ответ

0 голосов
/ 17 августа 2013

У меня была похожая проблема!Я определил визуальные состояния в сетке в шаблоне ControlTemplate.

        <Style x:Key="Image3TextRowButtonStyle" TargetType="Button">
        <Setter Property="Foreground" Value="{StaticResource ForegroundBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="RootGrid" Background="{StaticResource BackgroundBrush}">
                        ...
                        <VisualStateManager.VisualStateGroups>
                            ...
                            <VisualStateGroup x:Name="ActiveStates">
                                <VisualState x:Name="Active">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background)" Storyboard.TargetName="RootGrid">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackgroundActiveBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="NotActive" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

И пользовательский элемент управления:

<UserControl x:Class="Griesser.Presentation.ContactCenterClient.Client.Control.Image3TextRowButtonUC"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         x:Name="Image3TextRowButton">

<Grid>
    <Button x:Name="btn" Command="{Binding Command, ElementName=Image3TextRowButton}" Style="{StaticResource Image3TextRowButtonStyle}" />
</Grid>

В коде, который я смотрю первымдля RootGrid, а затем используйте GoToElementState:

        private void ChangeVisualActiveState(bool useTransitions)
    {
        // Search RootGrid, because the Visual States are defined in the ControlTemplate!
        FrameworkElement dt = btn.Template.FindName("RootGrid", btn) as FrameworkElement;

        if (IsActive)
        {
            VisualStateManager.GoToElementState(dt, "Active", useTransitions);
        }
        else
        {
            VisualStateManager.GoToElementState(dt, "NotActive", useTransitions);
        }
    }
...