2015-04-12 54 views
0

我有一個按鈕,它應該關閉當前窗口,並打開另一個窗口。但我想在關閉之前先淡出窗戶。我有一個故事板創建:如何調用XAML中完成的故事板命令

<Storyboard x:Key="Storyboard1"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Window"> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 

和我有按鈕:

<Button Content="Log In" Height="50" Margin="5" VerticalAlignment="Top" Width="190" DockPanel.Dock="Right" 
     Style="{DynamicResource ButtonLoginStyle}" Template="{DynamicResource ButtonBaseControlTemplate1}" 
     Command="{Binding LogInCommand}"> 
      <Button.Triggers> 
       <EventTrigger RoutedEvent="Button.LostMouseCapture"> 
        <BeginStoryboard Storyboard="{StaticResource Storyboard1}"></BeginStoryboard> 
       </EventTrigger> 
      </Button.Triggers> 
     </Button> 

有沒有辦法做到在XAML?或者我應該在代碼後面做?我試圖遵循MVVM原則,所以我猜想將故事板參考作爲參數發送給命令是毫無疑問的。

我也有其他問題,你們是否使用混合視覺工作室在XAML中創建用戶界面?或者自己編寫代碼是否更好?

回答

0

如果您遵循MVVM模式,我會建議您在代碼隱藏中編寫純UI相關(故事板動畫)事件,而不是引入視圖模型&模型。

Model.cs - 核心業務邏輯

ViewModel.cs - 業務邏輯操縱的用於用戶視圖和DATALOAD

View.Xaml - 結合UI設計與數據

View.Xaml.Cs - 加載的DataContext和純UI相關的事件(如:故事板動畫)

參考這篇文章:Most people are doing MVVM all wrong. Are you?

0

您可以在xaml中編寫這種故事板。 你需要創建一個以你的窗口爲目標的故事板,因此你應該給你的窗口名稱。 DoubleAnimation需要從1到0處理您的「不透明度」,並根據需要設置持續時間。故事板上有一個「完成」事件,您可以關閉窗戶等等。

<EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton"> 
    <BeginStoryboard Name="MyBeginStoryboard"> 
      <Storyboard > 
       <DoubleAnimation 
       Storyboard.TargetName="myWindow" 
       Storyboard.TargetProperty="Opacity" 
       Duration="0:0:5" From="1" To="0" /> 
      </Storyboard> 
      </BeginStoryboard> 
</EventTrigger> 

到您的其他問題,融合是非常好的工作預覽複雜的造型,但只有你是專家書面XAML後。以我自己的觀點 - 編寫自己的xaml更好,練習更好

0

這就是我鼓勵你去解決它。

創建一個具有兩個依賴性質的行爲:

public class StoryboardReactionBehavior : DependencyObject, IBehavior 
{ 
public DependencyObject AssociatedObject { get; private set; } 

public void Attach(DependencyObject associatedObject) 
{ 
    AssociatedObject = associatedObject; 
    (AssociatedObject as UIElement).Tapped += StoryboardReactionBehavior_Tapped; 
} 

private void StoryboardReactionBehavior_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) 
{ 

} 

public void Detach() 
{ 
    (AssociatedObject as UIElement).Tapped -= StoryboardReactionBehavior_Tapped; 
} 

}

和兩個屬性

public Storyboard Storyboard 
    { 
     get { return (Storyboard)GetValue(StoryboardProperty); } 
     set { SetValue(StoryboardProperty, value); } 
    } 

    public static readonly DependencyProperty StoryboardProperty = 
     DependencyProperty.Register("Storyboard", typeof(Storyboard), typeof(StoryboardReactionBehavior), new PropertyMetadata(null, StoryboardChanged)); 

    private static void StoryboardChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var behavior = d as StoryboardReactionBehavior; 
     if(behavior.Storyboard !=null) 
     { 
      behavior.Storyboard.Completed += (s, be) => 
      { 
       if (behavior.Command != null) 
       { 
        behavior.Command.Execute(null); 
       } 
      }; 
     } 
    } 
    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof(ICommand), typeof(StoryboardReactionBehavior), new PropertyMetadata(null)); 

最後讓我們調用時reation發生:

private void StoryboardReactionBehavior_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) 
    { 
     if (Storyboard != null) 
     { 
      Storyboard.Begin(); 
     } 
     else if(Command != null) 
     { 
      Command.Execute(null); 
     } 

    } 

我認爲這是最優雅的解決方案,並且隨處可見。

+0

某些顯示如何使用它的XAML代碼會很棒!我真的不知道如何使用它。 – Contango