2010-04-11 61 views
3

在WPF项目中,我有这样的XAML代码视觉状态管理器在WPF不是为我工作

<Window 
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" 
mc:Ignorable="d" 
xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
x:Class="WpfApplication1.MainWindow" 
xmlns:vsm="clr-namespace:System.Windows;assembly=WPFToolkit" 
x:Name="Window" 
Title="MainWindow" 
Width="640" Height="480"> 
<vsm:VisualStateManager.VisualStateGroups> 
    <vsm:VisualStateGroup x:Name="VisualStateGroup"> 
     <vsm:VisualState x:Name="Loading"> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="control" Storyboard.TargetProperty="(UIElement.Visibility)"> 
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Visible}"/> 
       </ObjectAnimationUsingKeyFrames> 
       <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Visibility)"> 
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Collapsed}"/> 
       </ObjectAnimationUsingKeyFrames> 
       <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="button1" Storyboard.TargetProperty="(UIElement.Visibility)"> 
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Visible}"/> 
       </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </vsm:VisualState> 
     <VisualState x:Name="Normal"> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="control" Storyboard.TargetProperty="(UIElement.Visibility)"> 
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Collapsed}"/> 
       </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </VisualState> 
    </vsm:VisualStateGroup> 
</vsm:VisualStateManager.VisualStateGroups> 
<Grid x:Name="LayoutRoot"> 
    <Grid.Resources> 
     <ControlTemplate x:Key="loadingAnimation"> 
      <Image x:Name="content" Opacity="1"> 
       <Image.Source> 
        <DrawingImage> 
         <DrawingImage.Drawing> 
          <DrawingGroup> 
           <GeometryDrawing Brush="Transparent"> 
            <GeometryDrawing.Geometry> 
             <RectangleGeometry Rect="0,0,1,1"/> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
           <DrawingGroup> 
            <DrawingGroup.Transform> 
             <RotateTransform x:Name="angle" Angle="0" CenterX="0.5" CenterY="0.5"/> 
            </DrawingGroup.Transform> 
            <GeometryDrawing Geometry="M0.9,0.5 A0.4,0.4,90,1,1,0.5,0.1"> 
             <GeometryDrawing.Pen> 
              <Pen Brush="Green" Thickness="0.1"/> 
             </GeometryDrawing.Pen> 
            </GeometryDrawing> 
            <GeometryDrawing Brush="Green" Geometry="M0.5,0 L0.7,0.1 L0.5,0.2"/> 
           </DrawingGroup> 
          </DrawingGroup> 
         </DrawingImage.Drawing> 
        </DrawingImage> 
       </Image.Source> 
      </Image> 
      <ControlTemplate.Triggers> 
       <Trigger Property="Visibility" Value="Visible"> 
        <Trigger.EnterActions> 
         <BeginStoryboard x:Name="animation"> 
          <Storyboard> 
           <DoubleAnimation From="0" To="359" Duration="0:0:1.5" RepeatBehavior="Forever" 
            Storyboard.TargetName="angle" Storyboard.TargetProperty="Angle"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </Trigger.EnterActions> 
        <Trigger.ExitActions> 
         <StopStoryboard BeginStoryboardName="animation"/> 
        </Trigger.ExitActions> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Grid.Resources> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="76.128" Width="Auto"/> 
     <ColumnDefinition MinWidth="547.872" Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="0.05*"/> 
     <RowDefinition Height="0.95*"/> 
    </Grid.RowDefinitions> 
    <Button x:Name="button" Margin="0,0,1,0.04" Width="100" Content="Load" d:LayoutOverrides="Height" Click="Button1_Click"/> 
    <Button x:Name="button1" HorizontalAlignment="Left" Margin="0,0,0,0.04" Width="100" Content="Stop" Grid.Column="1" d:LayoutOverrides="Height" Click="Button2_Click" Visibility="Collapsed"/> 
    <Control x:Name="control" Margin="10" Height="100" Grid.Row="1" Grid.ColumnSpan="2" Width="100" Template="{DynamicResource loadingAnimation}" Visibility="Collapsed"/> 
</Grid> 
</Window> 

,并在窗口后面的下面的代码

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      this.InitializeComponent(); 

     } 


     private void Button1_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
       VisualStateManager.GoToState(this, "Loading", true); 
     } 

     private void Button2_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      VisualStateManager.GoToState(this, "Normal", true); 
     } 
    } 

然而,当我点击第一个按钮(button1)状态变化未被触发。 我在做什么错?

在此先感谢

+0

修复你的代码。您的XAML与您的代码隐藏不匹配。 Button_Click处理程序在哪里? – majocha 2010-04-11 23:31:38

+0

@majocha:对不起,我在复制之前复制了XAML。这不会建立,这不是这里的交易 – 2010-04-12 22:32:23

回答

5

实际上,它是由.net 3.5设计的。 This guy有一个解决方法。

7

MSDN,当您使用视觉状态管理控件模板之外,你应该使用GoToElementState方法,而不是GoToState方法。虽然我没有测试过它。

+0

我认为你指的是VisualStateManager v4.0。 v3.5工具包上的版本不包含该方法。 – 2010-04-11 21:30:50

+0

您需要为'GoToState'方法使用'ExtendedVisualStateManager' – Mark 2010-04-12 05:03:21

+1

您是否指'GoToElementState'方法? – 2010-04-12 22:36:03

0

我想你的代码,并在设计师(VS2008 SP1)得到了一个错误:

值不能为空。
参数名:价值

每当我编辑的故事板代码。重新加载xaml会暂时“修复”问题。该代码仍在构建和运行,但我怀疑此错误的原因可能会影响您的问题。

DiscreteObjectKeyFrame的定义看起来有点偏离我。我

<vsm:VisualState x:Name="Focused"> 
    <Storyboard> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisualElement" 
          Storyboard.TargetProperty="Visibility" Duration="0"> 
     <DiscreteObjectKeyFrame KeyTime="0"> 
     <DiscreteObjectKeyFrame.Value> 
      <Visibility>Visible</Visibility> 
     </DiscreteObjectKeyFrame.Value> 
     </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</vsm:VisualState> 

不过,我想,你的代码,仍然不能得到它的工作,所以我已经看到了它在过去所做的唯一途径是作为this page描述了它的完成这样的即使这是 一个问题,它不是全部问题。

+0

该代码是由Blend生成的,所以我不知道它可能是什么错误,我仍然感到惊讶没有人还没有来过快速解决一个看起来很小的问题 – 2010-04-11 23:25:29

+0

问题是您发布的代码不会构建,因为您的第一个按钮没有代码隐藏处理程序。请确保您的代码无错地生成并运行,然后再发布。 – majocha 2010-04-12 00:54:30

+0

@Román - 好的 - 如果Blend生成它,它必须是合法的。我关于错误的观点仍然存在。 – ChrisF 2010-04-12 11:56:02

0

创建一个附加属性以更改视觉状态。这将为你工作

public class StateManager : DependencyObject 
     { 
      public static string GetVisualStateProperty(DependencyObject obj) 
      { 
       return (string)obj.GetValue(VisualStatePropertyProperty); 
      } 

      public static void SetVisualStateProperty(DependencyObject obj, string value) 
      { 
       obj.SetValue(VisualStatePropertyProperty, value); 
      } 
       public static readonly DependencyProperty VisualStatePropertyProperty = 
       DependencyProperty.RegisterAttached(
       "VisualStateProperty", 
       typeof(string), 
       typeof(StateManager), 
       new PropertyMetadata((s, e) => 
       { 
        var propertyName = (string)e.NewValue; 
        var ctrl = s as Grid; 
        if (ctrl == null) 
         throw new InvalidOperationException("This attached property only supports types derived from FrameworkElement."); 
        var transitionWorked = System.Windows.VisualStateManager.GoToElementState(ctrl, (string)e.NewValue, true); 
           })); 
     }