C# 如何在XAML中完成的序列图像板上调用命令

C# 如何在XAML中完成的序列图像板上调用命令,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个按钮,可以关闭当前窗口,然后打开另一个窗口。但我想先淡出窗外,然后再关上它。我创建了一个故事板: <Storyboard x:Key="Storyboard1"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Window"> <EasingDoubleKeyFr

我有一个按钮,可以关闭当前窗口,然后打开另一个窗口。但我想先淡出窗外,然后再关上它。我创建了一个故事板:

<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原则,所以我想将情节提要引用作为参数发送到命令是不可能的


我还有另外一个问题,你们是否使用blend for visual studio在XAML中创建UI?还是自己编写代码更好?

如果您遵循MVVM模式,我建议您在codebehind中编写纯UI相关(故事板动画)事件,而不要引入viewmodel和model

Model.cs-核心业务逻辑

ViewModel.cs-为用户视图和数据加载操作的业务逻辑

Xaml-UI设计和数据绑定

View.Xaml.Cs-加载Datacontext和纯UI相关事件(例如:故事板动画)


参考本文:

您可以用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>


对于您的另一个问题,blend非常适合用于预览复杂的样式,但只有在您精通编写xaml之后。在我看来,编写自己的xaml更好,为了更好地实践,我鼓励您这样做来解决这个问题

创建具有两个依赖项属性的行为:

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));
最后,让我们在创建发生时调用:

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

    }

我认为这是最优雅的解决方案,可以在任何地方附加。

一些演示如何使用它的XAML代码将非常棒!我真的不知道怎么用这个。