Текст WPF Исчезает out-then-in эффект

Другое голосование за C++ здесь... все еще мой фаворит у нескольких близких подписчиков - C и Python. Вот мой текущий список ненависти без определенного порядка:

  • Изобилие целых типов, наследованных от C - слишком много проблем, вызванных со знаком по сравнению с неподписанными ошибками
  • конструкторы Копии и операторы присваивания - почему компилятор не может создать один из другого автоматически?
  • безумие Аргумента переменной - va_list просто не работает с объектами, и я так сыт по горло проблемами, созданными с sprintf (), snprintf (), vsnprintf (), и все их родственники.
  • Шаблонная реализация требуется, чтобы быть полностью видимой во время компиляции - я думаю об отсутствии реализаций "экспорта" или по крайней мере применимых
  • Отсутствие поддержки свойств - я хочу иметь участника только для чтения как "a.x", который может быть считан публично и только присвоен внутренне. Я действительно ненавижу "val=obj.getX ()" и "obj.setX (val)". Я действительно хочу свойства с управлением доступом и непротиворечивым синтаксисом.
6
задан 11 August 2009 в 21:22
поделиться

4 ответа

Лучшим решением для этой задачи было бы использование «Transition Presenter». Презентатор перехода - это контейнер для вашего элемента управления (может быть TextBlock или что-то еще), который реагирует на изменение содержимого, применяя назначенный переход. Вы можете выбрать один из предопределенных переходов или создать свой собственный (используя XAML). Обычно ведущий перехода использует шаблон данных для отображения связанных данных. Самый простой пример будет выглядеть так:

<lib:TransitionPresenter Transition="{StaticResource FadeTransition}
    Content="{Binding MyValue}">
    <lib:TransitionPresenter.Resources>
        <DataTemplate DataType="{x:Type System:string}">
            <TextBlock Text={Binding}/>
        </DataTemplate>
    </lib:TransitionPresenter.Resources>
</lib:TransitionPresenter>

Вот две библиотеки с исходным кодом, которые реализуют презентацию перехода:

1
ответ дан 17 December 2019 в 04:50
поделиться

Я не думаю, что это возможно в решении только для XAML. TextBlock не знает о «старом» и «новом» тексте, только Text.

Я бы сделал это, создав пользовательский элемент управления, производный от TextBlock, и проделал бы следующее с событием TargetUpdated-event:

  • Вызов раскадровки «Угасание»
  • Изменить текст
  • Вызов раскадровки «Затухание»

Удачи :)

-1
ответ дан 17 December 2019 в 04:50
поделиться

Я с frances1983 по этому поводу. Что бы я сделал, так это создать новый UserControl, который фактически плавно обрабатывает старый и новый текст с плавными переходами.

Я делаю нечто подобное с ярлыком, который я хочу отображать только пару секунд, а затем исчезать. Вот что я сделал:

<Label  Name="lbl" DockPanel.Dock="Bottom" HorizontalAlignment="Center" Visibility="Collapsed">
    <Label.Style>
        <Style TargetType="{x:Type Label}">
            <Style.Triggers>
                <Trigger Property="Visibility" Value="Visible">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:00" BeginTime="00:00:00" From="0.0" To="1.0" />
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:03" BeginTime="00:00:02" From="1.0" To="0.0" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
    Display Text
</Label>

И затем в коде, где текст метки изменяется:

//Make the label visible, starting the storyboard.
lbl.Visibility = Visibility.Visible;

DispatcherTimer t = new DispatcherTimer();
//Set the timer interval to the length of the animation.
t.Interval = new TimeSpan(0, 0, 5);
t.Tick += (EventHandler)delegate(object snd, EventArgs ea)
{
    // The animation will be over now, collapse the label.
    lbl.Visibility = Visibility.Collapsed;
    // Get rid of the timer.
    ((DispatcherTimer)snd).Stop();
};
t.Start();

Вы можете легко преобразовать этот образец в UserControl. Просто измените затухание на Visibility == Hidden, добавьте раскадровку, которая делает противоположное для Visibility == Visible, и измените текст и сбросьте видимость внутри обработчика Tick.

Надеюсь, это поможет!

3
ответ дан 17 December 2019 в 04:50
поделиться

Вот реализация, которая автоматически выполняет постепенное исчезновение, значение переключения, плавное увеличение

Для использования (после установки xmlns: l в правильное пространство имен:

Label l:AnimatedSwitch.Property="Content" l:AnimatedSwitch.Binding="{Binding SomeProp}"/>

Код (это является проверочным кодом, без обработки ошибок и не готов к производству).

public class AnimatedSwitch : DependencyObject
{
    // Define the attached properties

    public static DependencyProperty BindingProperty =
        DependencyProperty.RegisterAttached("Binding", typeof(object), typeof(AnimatedSwitch),
        new PropertyMetadata(BindingChanged));
    public static DependencyProperty PropertyProperty =
        DependencyProperty.RegisterAttached("Property", typeof(string), typeof(AnimatedSwitch));
    public static object GetBinding(DependencyObject e)
    {
        return e.GetValue(BindingProperty);
    }
    public static void SetBinding(DependencyObject e, object value)
    {
        e.SetValue(BindingProperty, value);
    }
    public static string GetProperty(DependencyObject e)
    {
        return (string)e.GetValue(PropertyProperty);
    }
    public static void SetProperty(DependencyObject e, string value)
    {
        e.SetValue(PropertyProperty, value);
    }

    // When the value changes do the fadeout-switch-fadein

    private static void BindingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Storyboard fadeout = new Storyboard();
        var fadeoutAnim = new DoubleAnimation(){To=0,Duration=new Duration(TimeSpan.FromSeconds(0.3))};
        Storyboard.SetTarget(fadeoutAnim,d);
        Storyboard.SetTargetProperty(fadeoutAnim, new PropertyPath("Opacity"));
        fadeout.Children.Add(fadeoutAnim);
        fadeout.Completed += (d1, d2) =>
            {
                d.GetType().GetProperty(GetProperty(d)).SetValue(d, GetBinding(d), null);

                Storyboard fadein = new Storyboard();
                var fadeinAnim = new DoubleAnimation() { To = 1, Duration = new Duration(TimeSpan.FromSeconds(0.3)) };
                Storyboard.SetTarget(fadeinAnim, d);
                Storyboard.SetTargetProperty(fadeinAnim, new PropertyPath("Opacity"));
                fadein.Children.Add(fadeinAnim);
                fadein.Begin();
            };
        fadeout.Begin();
    }
}
2
ответ дан 17 December 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: