Xaml Windows应用商店应用程序:在可见性更改时设置控件动画?

Xaml Windows应用商店应用程序:在可见性更改时设置控件动画?,xaml,windows-store-apps,winrt-xaml,Xaml,Windows Store Apps,Winrt Xaml,在我的应用程序中,我有一个可见性绑定到视图模型中某个属性的网格 我要做的是,当视图模型的“可见性”属性更改时,栅格将根据可见性值“可见/折叠”淡入或淡出 如何实现这一点?您需要一个新的DependencyProperty,可以从Grid继承并添加一个属性,也可以创建一个附加属性。我们将其称为DelferredVisibility,并将其命名为Visibility类型 当DeferredVisibility更改为Visible时,将可见性设置为Visible,并将不透明度从0设置为1 当Defer

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

我要做的是,当视图模型的“可见性”属性更改时,栅格将根据可见性值“可见/折叠”淡入或淡出


如何实现这一点?

您需要一个新的DependencyProperty,可以从Grid继承并添加一个属性,也可以创建一个附加属性。我们将其称为DelferredVisibility,并将其命名为Visibility类型

当DeferredVisibility更改为Visible时,将可见性设置为Visible,并将不透明度从0设置为1


当DeferredVisibility更改为Collazed时,将不透明度从1设置为0,然后将可见性设置为Collazed。

您需要一个新的DependencyProperty,方法是从栅格继承并添加一个属性,或者创建一个附加属性。我们将其称为DelferredVisibility,并将其命名为Visibility类型

当DeferredVisibility更改为Visible时,将可见性设置为Visible,并将不透明度从0设置为1

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

受“HDW生产”答案的启发,以下是Windows应用商店和Windows Phone应用商店的代码:

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; }
    }
}
受“HDW生产”答案的启发,以下是Windows应用商店和Windows Phone应用商店应用程序的代码:

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; }
    }
}

你在挣扎什么?听一个财产的变化?动画?折叠立即生效的事实?是的,我不希望它立即折叠,我希望它随着可见性属性的更改而淡入/淡出。在这种情况下,您必须为这两种状态制作故事板并运行它们,在每个故事板完成后,您必须将属性设置为其值。@loop ok,知道故事板将在页面的XAML/Code-behind中定义,而不是在视图模型中定义,我如何倾听visibility属性中的更改?我所做的一切都是解决方法。在属性的setter中,您向视图发送了一条消息,在messagereceiving事件中,我运行故事板,并在其完成时设置属性。在我检查过的那片土地上=以前的值。我使用了mvvm Messenger类。你在挣扎什么?听一个财产的变化?动画?折叠立即生效的事实?是的,我不希望它立即折叠,我希望它随着可见性属性的更改而淡入/淡出。在这种情况下,您必须为这两种状态制作故事板并运行它们,在每个故事板完成后,您必须将属性设置为其值。@loop ok,知道故事板将在页面的XAML/Code-behind中定义,而不是在视图模型中定义,我如何倾听visibility属性中的更改?我所做的一切都是解决方法。在属性的setter中,您向视图发送了一条消息,在messagereceiving事件中,我运行故事板,并在其完成时设置属性。在我检查过的那片土地上=以前的值。我使用了mvvm Messenger类。谢谢,似乎没有其他方法可以做到这一点。谢谢,似乎没有其他方法可以做到这一点