Непрозрачность UserControl на видимости - PullRequest
2 голосов
/ 11 января 2012

Это уже было решено ранее, но я не могу заставить его работать должным образом ... должно быть очень просто!

Вот мой XAML:

<UserControl.Style>
    <Style TargetType="UserControl">
        <Style.Triggers>
            <Trigger Property="Visibility" Value="Visible">
                <Trigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard x:Name="FadeOutAnimation">
                            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                FillBehavior="Stop"
                                BeginTime="0:0:5" From="1.0" To="0.0"
                                Duration="0:0:1"/>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames 
                                Storyboard.TargetProperty="Visibility"
                                BeginTime="0:0:7">
                                <DiscreteObjectKeyFrame>
                                    <DiscreteObjectKeyFrame.Value>
                                        <Visibility>Hidden</Visibility>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.ExitActions>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Style>

Это работает какОжидается: если свойство Visibility элемента управления установлено на Visible, элемент управления отображается в течение 5 секунд, затем исчезает в течение 1 секунды.Видимость элемента управления затем сбрасывается на Скрытый через 7 секунд (странно, но 6, общее время анимации затухания оказалось недостаточным - еще одна ошибка MS, я думаю!).

При последующих событиях Button.Clickсвойство Visibility кажется заблокированным или заблокированным для Hidden и не может снова стать Visible!

Есть идеи, почему нет?

Ответы [ 4 ]

1 голос
/ 25 октября 2016

Можно анимировать непрозрачность (и, при необходимости, переводить), используя свойства Transitionz ( Github , NuGet )

В качестве простого примера проекта используйте следующий код:

<Window x:Class="WpfApplication15.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:tz="http://schemas.abtsoftware.co.uk/transitionz"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="b2vc"></BooleanToVisibilityConverter>
    </Window.Resources>
    <Grid>
        <CheckBox x:Name="CheckBox" Content="Is Visible?" IsChecked="False"></CheckBox>
        <TextBlock Text="Hello World!" FontSize="44" HorizontalAlignment="Center" VerticalAlignment="Center"
            Visibility="Collapsed"
            tz:Transitionz.Opacity="{tz:OpacityParams From=0, To=1, Duration=200, TransitionOn=Visibility}"
            tz:Transitionz.Translate="{tz:TranslateParams From='10,0', To='0,0', Duration=200, TransitionOn=Visibility}"
            tz:Transitionz.Visibility="{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource b2vc}}"/>
    </Grid>
</Window>

Что приводит к такому выводу:

enter image description here

1 голос
/ 12 января 2012

Так как свойства, установленные в области анимации, не могут быть установлены без скачков через обручи, как показано по ссылке, отправленной LPL (что действительно помогло, кстати!), Я придумал решение за кодом, а не в XAML:

private void UserControl_IsVisibleChanged(object sender, 
    DependencyPropertyChangedEventArgs e)
{
    if (this.Visibility == Visibility.Visible)
    {
        DoubleAnimation fadeIn = new DoubleAnimation();
        fadeIn.From = 1d;
        fadeIn.To = 1d;
        fadeIn.Duration = new Duration(new TimeSpan(0, 0, 0));

        DoubleAnimation fade = new DoubleAnimation();
        fade.From = 1d;
        fade.To = 0d;
        fade.BeginTime = TimeSpan.FromSeconds(((MessageTextProperties)  
            DataContext).Duration);
        fade.Duration = new Duration(new TimeSpan(0, 0, 1));

        NameScope.SetNameScope(this, new NameScope());
        this.RegisterName(this.Name, this);

        Storyboard.SetTargetName(fadeIn, this.Name);
        Storyboard.SetTargetProperty(fadeIn, new PropertyPath
            (UIElement.OpacityProperty));

        Storyboard.SetTargetName(fade, this.Name);
        Storyboard.SetTargetProperty(fade, new PropertyPath
            (UIElement.OpacityProperty));

        Storyboard sb = new Storyboard();
        sb.Children.Add(fadeIn);
        sb.Children.Add(fade);

        sb.Completed += new EventHandler(sb_Completed);
        sb.Begin(this);
    }
}

void sb_Completed(object sender, EventArgs e)
{
    this.Visibility = Visibility.Hidden;
}

}

Хитрость в sb_Completed.Поскольку значение равно в рамках запущенной анимации, Visibility можно сбросить на Hidden.

1 голос
/ 06 июня 2012

Может быть, это будет полезно и вам

void UControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (this.Visibility == Visibility.Visible)
            {
                Storyboard sb = new Storyboard();
                DoubleAnimation da = new DoubleAnimation();
                da.From = 0;
                da.To = 1;
                da.Duration = new Duration(TimeSpan.FromSeconds(2));
                sb.Children.Add(da);
                Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
                Storyboard.SetTarget(da, this);
                sb.Completed += new EventHandler(sb_Completed);
                sb.Begin();
            }

            if (this.Visibility == Visibility.Hidden || this.Visibility == Visibility.Collapsed)
            {
                Storyboard sb = new Storyboard();
                DoubleAnimation da = new DoubleAnimation();
                da.From = 1;
                da.To = 0;
                da.Duration = new Duration(TimeSpan.FromSeconds(2));
                sb.Children.Add(da);
                Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
                Storyboard.SetTarget(da, this);
                sb.Completed += new EventHandler(sb_Completed);
                sb.Begin();
            }
        }

        void sb_Completed(object sender, EventArgs e)
        {
            this.Visibility = Visibility.Visible;
        }
1 голос
/ 11 января 2012

Помогает ли FillBehavior="Stop" в вашей раскадровке ExitActions?Я думаю, что этот раскадровка содержит значение видимости.

Посмотрите на Как: установить свойство после его анимации с раскадровкой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...