【问题标题】:Windows Store Apps: animate control when visibility changes?Windows 应用商店应用程序:可见性变化时的动画控制?
【发布时间】:2016-03-30 21:35:17
【问题描述】:

在我的应用程序中,我有一个可见性绑定到视图模型中的属性的网格。

我想要做的是当视图模型的可见性属性发生变化时,网格根据可见性值淡入或淡出:Visible/Collapsed。

我怎样才能做到这一点?

【问题讨论】:

  • 你在纠结什么?听财产变化?动画?崩溃是立即生效的事实?
  • 是的,我不希望它立即折叠,我希望它随着可见性属性的变化而淡入/淡出
  • 在这种情况下,您必须为两种状态制作故事板并运行它们,并且在完成每个故事板后,您必须将属性设置为其值。
  • @loop 好的,我怎么能听到可见性属性的变化,知道故事板将在页面的 XAML/代码后面定义,而不是在视图模型中
  • 我所做的都是解决方法。在属性的设置器中,您已向视图发送消息,并且在消息接收事件中我运行情节提要并在其完成时设置属性。在属性的设置器中,我检查了!=PreviousValue。我使用了 mvvm Messenger Class。

标签: xaml windows-store-apps winrt-xaml


【解决方案1】:

受“HDW Production”回答的启发,以下是 Windows Store 和 Windows Phone Store 应用的代码:

public class FadingVisibilityGrid : Grid
{
    public static readonly DependencyProperty DeferredVisibilityProperty = DependencyProperty.Register(
        "DeferredVisibility", typeof (Visibility), typeof (FadingVisibilityGrid), new PropertyMetadata(default(Visibility), DeferredVisibilityChanged));

    private static void DeferredVisibilityChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var newVisibility = (Visibility)e.NewValue;
        var grid = (FadingVisibilityGrid)sender;


        var animation = new DoubleAnimation
        {
            Duration = new Duration(TimeSpan.FromMilliseconds(200))
        };
        Storyboard.SetTarget(animation, grid);
        Storyboard.SetTargetProperty(animation, "Grid.Opacity");
        grid.FadeStoryBoard.Stop();
        grid.FadeStoryBoard = new Storyboard();
        grid.FadeStoryBoard.Children.Add(animation);

        if (newVisibility == Visibility.Visible)
        {
            animation.From = 0;
            animation.To = 1;
            grid.Visibility = Visibility.Visible;
            grid.FadeStoryBoard.Begin();
        }
        else
        {
            animation.From = 1;
            animation.To = 0;
            grid.FadeStoryBoard.Completed += (o, o1) =>
            {
                grid.Visibility = newVisibility;
            };
            grid.FadeStoryBoard.Begin();
        }

    }

    public Visibility DeferredVisibility
    {
        get { return (Visibility) GetValue(DeferredVisibilityProperty); }
        set { SetValue(DeferredVisibilityProperty, value); }
    }

    private Storyboard _fadeStoryBoard = new Storyboard();

    public Storyboard FadeStoryBoard
    {
        get { return _fadeStoryBoard; }
        set { _fadeStoryBoard = value; }
    }
}

【讨论】:

    【解决方案2】:

    您需要一个新的 DependencyProperty,要么从 Grid 继承并添加一个,要么通过创建附加属性。我们称它为 DeferredVisibility 并让它成为 Visibility 类型。

    当 DeferredVisibility 更改为 Visible 时,将 Visibility 设置为 Visible 并将不透明度从 0 设置为 1。

    当 DeferredVisibility 更改为 Collapsed 时,将不透明度从 1 设置为 0,然后将 Visibility 设置为 Collapsed。

    【讨论】:

    • 谢谢,好像没有别的办法了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多