2010-06-01 6 views
0

Я пытаюсь выяснить, как работает VisualStateManager, но я не могу этого сделать.WPF: VisualStateManager не работает

Я хочу сделать это: у меня есть некоторые текстовые поля, где пользователь может ввести свое имя, адрес, ... и я делаю проверку, и я не хотел этого делать с помощью validationrules-binding в XAML , Я использую MVVM-шаблон, и некоторый код моей модели просмотра делает это. Поэтому я привязываю текст текстового поля к строке, которая была проверена для модели viewmodel, и у меня есть логическая переменная, которая указывает, правильна она или нет.

Мой XAML:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:Custom="http://schemas.microsoft.com/surface/2008" 
mc:Ignorable="d" 
x:Class="Surface_Bachelorarbeit.NeuerUser" 
x:Name="UserControl" 
UseLayoutRounding="True" 
d:DesignWidth="640" d:DesignHeight="480" Width="800" Height="350"> 
<Border x:Name="Border1" BorderBrush="Black" BorderThickness="5" CornerRadius="5" DataContext="{Binding Source={StaticResource MainViewModelDataSource}}"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisibilityStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0" To="NameValid"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_valid"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_invalid"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualTransition> 
       <VisualTransition GeneratedDuration="0" To="NameInvalid"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_invalid"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_valid"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualTransition> 
      </VisualStateGroup.Transitions> 
      <VisualState x:Name="NameValid"/> 
      <VisualState x:Name="NameInvalid"/> 


     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
... 
     <Custom:SurfaceTextBox x:Name="vname" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Margin="0,1,22,8" FontSize="14.667" SelectionBrush="{x:Null}" BorderBrush="{x:Null}" Foreground="Black" DataContext="{Binding Forename}" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="vname_LostFocus"/> 
... 
       <Image x:Name="VN_valid" HorizontalAlignment="Left" Margin="0,1,0,0" Width="22" Source="valid.png" Height="22" VerticalAlignment="Top" d:LayoutOverrides="Height"/> 
      <Image x:Name="VN_invalid" HorizontalAlignment="Left" Margin="0,1,0,0" Width="22" Height="22" Source="invalid.png" VerticalAlignment="Top" d:LayoutOverrides="Height"/> 
... 

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

private void vname_LostFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     mvm = ((MainViewModel)FindResource("MainViewModelDataSource")); 
     if (mvm.NewCreatedStoreUser.Forename.Valid) 
     { 
      VisualStateManager.GoToState(this, "NameValid", true); 

     } 
     else 
     { 
      VisualStateManager.GoToState(this, "NameInvalid", true); 

     } 

    } 

Я попробовал и состояние не изменяется, хотя событие происходит и его идет вправо GoToState-Method. Ничего не произошло.

Я также пробовал
ExtendedVisualStateManager.GoToElementState (this.Border1 как FrameworkElement, "NameValid", false);

потому что я читал здесь, что это поможет, но это как раз то же самое с этим ...

Что я сделал не так ??

+0

Я сам нашел ошибку ... Забыл вставить анимацию в нужное место .... = / – sofri

ответ

0

Я думаю, что VisualStateManager UserControl не работает, я не знаю почему. Я использовал Control.