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代码将非常棒!我真的不知道怎么用这个。