2012-06-14 53 views
3

我有一個簡單的MVVM應用程序。它包含一個屬性,當一個方法正確執行時,我將更改爲true,如果它現在執行,則爲false。當此屬性更改時,我想在我的WPF應用程序的狀態欄上顯示「Passed」或「Failed」幾秒鐘,然後使其消失。試圖開始在WPF應用程序中更改屬性的故事板

因此,我已經閱讀StackOverflow,並強力Google搜索,無濟於事。我想我誤解了我需要構建故事板。

在我的狀態欄中,我添加了一個故事板,我試圖在我的XAML文件的開頭處觸發<UserControl.Resources>。它是否正確 ?目前我使用0/1的虛擬值,我假定正確的做法是使用我可以創建的BooleanToString轉換器,或者有更好的方法嗎?

所以我的狀態欄包含:

<StatusBar > 
    <StatusBar.Resources> 
    <Storyboard x:Key="StatusBar" > 
     <DoubleAnimationUsingKeyFrames 
        Storyboard.TargetProperty="(UIElement.Opacity)" 
        Storyboard.TargetName="statusBarItem"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:3" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:4" Value="0"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    </StatusBar.Resources> 
</StatusBar> 

,我試圖爲這個寄存器被稱爲在我UserControl.Resources:

我有我的結構compl完全倒退?它不會編譯,我得到的錯誤:

A value of type 'BeginStoryboard' cannot be added to a collection or dictionary of type 'SetterBaseCollection'. 

任何幫助,資源或信息將非常感激。非常感謝。

回答

4

下面是一個例子。您需要使用觸發器來啓動故事板。

<Grid> 
    <Grid.DataContext> 
     <WpfApplication1:MainViewModel/> 
    </Grid.DataContext> 

    <Grid.Resources> 
     <Style x:Key="statusStyle" TargetType="StatusBar"> 
      <Setter Property="Opacity" Value="0"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Pulse}" Value="True"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimationUsingKeyFrames 
            AutoReverse="True" 
            Storyboard.TargetProperty="(UIElement.Opacity)" > 
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> 
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="1"/> 
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="0"/> 
           </DoubleAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="auto"/> 
    </Grid.RowDefinitions> 

    <StatusBar Style="{StaticResource statusStyle}" 
         Grid.Row="1" ItemsSource="{Binding Items}" /> 
    <CheckBox Content="CheckBox" Height="16" 
         HorizontalAlignment="Left" Margin="41,30,0,0" 
         IsChecked="{Binding Pulse}" VerticalAlignment="Top" /> 
</Grid> 

視圖模型

public class MainViewModel : ViewModelBase 
{ 
    private bool _pulse; 

    public MainViewModel() 
    { 
     Items = new[] {"Passed"}; 
    } 

    public IList<string> Items { get; private set; } 

    public bool Pulse 
    { 
     get { return _pulse; } 
     set { Set(()=>Pulse, ref _pulse, value); } 
    } 
} 
+0

我在哪裏可以找到的ViewModelBase的實施? – Guge

+0

@Guge如果我記得那是MVVM燈。它在這種情況下所做的就是INotifyPropertyChanged的實現。 – Phil