2010-04-11 35 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); 
           })); 
     }