2012-01-11 2 views
1

Дизайнер дал мне дочернее окно Silverlight, которое было разработано в Expression Blend, и использует диспетчер визуальных состояний для переключения между двумя режимами. Короче говоря, в дочернем окне есть кнопка расширения, которая при нажатии на нее сглаживает еще один элемент управления сеткой с подробной информацией.Переключение на визуальное состояние из кода с помощью VisualStateManager

Это взаимодействие происходит полностью в XAML. Однако мне нужно улучшить его, чтобы, если выполняются определенные условия, скажем, если пользователь выберет какой-либо вариант «Всегда показывать расширенные данные» - что при открытии дочернего окна будет расширено расширенное визуальное состояние.

Я думал, что это было так же просто, как вызов:

VisualStateManager.GoToState(this, "VisualStateDetails", false); 

Но это не работает. Что мне не хватает? (Я прошу прощения, если я пропущу что-то очевидное, я относительно не знаком с Silverlight и совсем не знаком с Visual State Manager.)

Вот XAML, который немного удален для краткости.

<Grid x:Name="LayoutRoot" Margin="2" DataContext="{Binding ProjectNode, Mode=TwoWay}"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="EditorWindowStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0:0:0.5"> 
        <VisualTransition.GeneratedEasingFunction> 
         <CubicEase EasingMode="EaseInOut"/> 
        </VisualTransition.GeneratedEasingFunction> 
       </VisualTransition> 
      </VisualStateGroup.Transitions> 
      <VisualState x:Name="VisualStateNormal"/> 
      <VisualState x:Name="VisualStateDetails"> 
       <Storyboard> 
        <!-- snip --> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <VisualStateManager.CustomVisualStateManager> 
     <ei:ExtendedVisualStateManager/> 
    </VisualStateManager.CustomVisualStateManager> 

    <!-- snip --> 

А вот кнопка, при нажатии, расширяет детали:

<Button ...> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <ei:GoToStateAction StateName="VisualStateDetails"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

Спасибо!

+0

Это «Кнопка» внутри «сети»? Если нет, вы должны вызвать состояние следующим образом: VisualStateManager.GoToState (LayoutRoot, «VisualStateDetails», false); – NestorArturo

+0

У меня нет доступа к коду прямо сейчас, но имеет ли значение, где находится кнопка? Чтобы быть ясным, я хочу перейти к значению «VisualStateDetails» из кода, а именно в методе «Инициализация» дочернего окна. И я помню, что я попытался использовать 'LayoutRoot' в качестве первого параметра для GoToState, но я получил сообщение об ошибке, что Grid не является элементом управления. –

+0

Да ... важно положение кнопки в соответствии с элементом управления, имеющим VisualStateManager, если он находится внутри или снаружи, которые управляют изменениями синтаксиса. – NestorArturo

ответ

0

Проблема заключается в том, что диспетчер визуальных состояний не играет хорошо в окне Child.

Эта запись в блоге описала проблему и предоставляет два обходных пути. Первый из них (используя ExtendedVisualStateManager класс) сделал трюк для меня:

Using Visual State Manager with Silverlight Toolkit’s Child Windows control