Другое голосование за C++ здесь... все еще мой фаворит у нескольких близких подписчиков - C и Python. Вот мой текущий список ненависти без определенного порядка:
Лучшим решением для этой задачи было бы использование «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>
Вот две библиотеки с исходным кодом, которые реализуют презентацию перехода:
Я не думаю, что это возможно в решении только для XAML. TextBlock не знает о «старом» и «новом» тексте, только Text.
Я бы сделал это, создав пользовательский элемент управления, производный от TextBlock, и проделал бы следующее с событием TargetUpdated-event:
Удачи :)
Я с 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.
Надеюсь, это поможет!
Вот реализация, которая автоматически выполняет постепенное исчезновение, значение переключения, плавное увеличение
Для использования (после установки 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();
}
}