ForcingPropertyChangedCallback DP для стрельбы
Мой вопрос может звучать немного похожим на этот вопрос
У меня есть панель уведомлений, которая подвергается определенным анимациям при изменении свойства DependencyProperty моего пользовательского элемента управления UserControl. Здесь идет реализация кода:
public string StatusBarText
{
get { return (string)GetValue(StatusBarTextProperty); }
set { SetValue(StatusBarTextProperty, value); }
}
public static readonly DependencyProperty StatusBarTextProperty =
DependencyProperty.Register("StatusBarText", typeof(string), typeof(WorkspaceFrame), new FrameworkPropertyMetadata(null, StatusBarTextChangedCallBack));
private static void StatusBarTextChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!string.IsNullOrWhiteSpace(Convert.ToString(e.NewValue)))
{
var workspaceFrame = d as WorkspaceFrame;
if (null == workspaceFrame)
return;
var storyboard = workspaceFrame.FindResource("notificationBarAnimation") as Storyboard;
if (null == storyboard)
return;
var statusBar = workspaceFrame.Template.FindName("PART_StatusBar", workspaceFrame) as Border;
if (null == statusBar)
return;
//Run the animation
storyboard.Begin(statusBar);
}
}
и вот граница, которая становится анимированной:
<Border x:Name="PART_StatusBar" Margin="5" BorderThickness="2" VerticalAlignment="Top"
DataContext="{Binding Path=StatusText}" Opacity="0"
Visibility="{Binding Path=Opacity, Mode=OneWay, RelativeSource={RelativeSource Self}, Converter={StaticResource doubleToVis}}"
BorderBrush="{StaticResource StatusMessageBackBrush}">
<Border.Background>
<SolidColorBrush Color="{StaticResource StatusMessageBackColor}" Opacity="0.7"/>
</Border.Background>
<TextBlock Margin="10" FontSize="17" Foreground="{StaticResource BlackColorBrush}" Text="{Binding}">
</TextBlock>
</Border>
Как вам сейчас может быть понятно, этот DP связан со свойством VM, которое запускает PropertyChangedNotification (из INotifyProeprtyChanged), когда установлено. Теперь проблема в том, что StatusBarTextChangedCallBack вызывается, только если есть некоторые изменения в старом и новом значении DP. Есть ли способ заставить его работать? Если нет, есть ли способ обойти? Мне нужно показывать одно и то же уведомление снова и снова. И анимация должна срабатывать.
С уважением,
Джеймс
2 ответа
Вы можете зарегистрировать CoerceValueCallBack
функция вместо ValueChanged. Что-то вроде этого:
public static readonly DependencyProperty StatusBarTextProperty =
DependencyProperty.Register("StatusBarText", typeof(string), typeof(WorkspaceFrame), new FrameworkPropertyMetadata(null,null, StatusBarTextCoerceValueCallBack));
private static object StatusBarTextCoerceValueCallBack(DependencyObject d, object value)
{
}
CoerceValueCallback всегда будет запускаться, когда значение свойства изменяется, даже если значение одинаково.
Спасибо
Обычный способ достичь желаемого (или вызвать обработчик событий вручную) - создать метод для запуска анимации. Затем вызовите этот метод запуска анимации из вашего обработчика измененного свойства. Таким образом, вы можете просто вызвать этот метод, когда вам нужно.