VisualStateManager.GoToState возвращает false, и визуальное состояние не изменяется

У меня есть этот код XAML:

       <Button x:Name="btnStartRecord" Visibility="Collapsed">
            <Button.BorderBrush>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="#FFF3883E" Offset="1"/>
                </LinearGradientBrush>
            </Button.BorderBrush>
        </Button>
        <Button x:Name="btnStopRecord" Visibility="Collapsed">
            <Button.BorderBrush>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="#FFF3883E" Offset="1"/>
                </LinearGradientBrush>
            </Button.BorderBrush>
        </Button>

<VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="MainStates">
                <VisualState x:Name="RecordIconState">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="btnStartRecord" Storyboard.TargetProperty="(UIElement.Visibility)">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Visible"/>
                            <!--<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>-->
                        </ObjectAnimationUsingKeyFrames>
                        <!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="btnStopRecord" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>-->
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="StopRecordIconState">
                    <Storyboard>
                        <!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="btnStartRecord" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>-->
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="btnStopRecord" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
                </VisualStateGroup>                
        </VisualStateManager.VisualStateGroups>

А в Code Behind я вызываю следующую функцию в OnLoad / Constructor:

private void SwitchRecordButtonContent()
    {
        {
            if (m_bRecording)
            {
                //btnStartStopRecord.Content = "StopRecord";
                VisualStateManager.GoToState(this, StopRecordIconState.Name, false);
                VisualState currentState = MainStates.CurrentState;
                Visibility temp = btnStartRecord.Visibility;
            }
            else
            {
                //btnStartStopRecord.Content = "StartRecord";
                bool op = VisualStateManager.GoToState((Button)this.btnStartRecord, RecordIconState.Name, false); // I get this always false
                VisualState currentState = MainStates.CurrentState;
                Visibility temp = btnStartRecord.Visibility;
            }
        }
    }

Но я не вижу изменения визуального состояния и не могу понять почему :(

Я что-то делаю не так?


person ashish nirkhe    schedule 10.12.2013    source источник
comment
Прикреплен ли VSM к корневому элементу?   -  person atomaras    schedule 10.12.2013
comment
да, в сетку выше кода xaml.   -  person ashish nirkhe    schedule 10.12.2013
comment
@atomaras Большое спасибо. Несмотря на то, что VAM был прикреплен к корню моего контекста, вокруг него была дополнительная сетка. Я попытался прикрепить его к этому, и это сработало! Большой!! Большое спасибо :)   -  person ashish nirkhe    schedule 10.12.2013


Ответы (2)


Вы звоните

VisualStateManager.GoToState((Button)this.btnStartRecord, RecordIconState.Name, false); // I get this always false

но с первого взгляда ты должен звонить

VisualStateManager.GoToState(this, RecordIconState.Name, false);
person Filip Skakun    schedule 10.12.2013
comment
Кстати, мне нравится идея получить имя именованного состояния для использования при переходе в это состояние. С чего взял? Мне тоже нужно начать это делать. - person Filip Skakun; 10.12.2013
comment
Привет, Филип, я попробовал оба способа. Если вы видите, в части «ЕСЛИ» я пытался отправить это, но это не сработало. Поэтому я попробовал кнопку, которая тоже не сработала. именование в этом стиле я использовал для собственного удобства. Код слишком большой, поэтому я использовал его, чтобы упростить то, что он делает именно через несколько дней. Приятно, что тебе понравилось. Многим это не нравится :) Кстати, если найдете другой способ решения проблемы, дайте мне знать. Спасибо :) - person ashish nirkhe; 10.12.2013

как атомар, упомянутый в комментарии выше, переместил код в самый корень пользовательского элемента управления, и он сработал :)

person ashish nirkhe    schedule 10.12.2013