Я создал пользовательский TextBlock
, который меняет Visibility
через несколько секунд, заданный DependencyProperty
ShowTime
:
<customUserControl:AutoHideTextBlock Text="AutoHideTextBlock" Visibility="{Binding IsVisibleEnabled, Converter={StaticResource BoolToVisConverter}}" ShowTime="3"/>
Это хорошее решение, и оно работает, проблема в том, что у меня есть несколько других элементов, которым нужно такое же поведение, и я не могу сделать это CustomUserControl
для всех них, я создал следующий класс, чтобы помочь мне с этим:
public class AutoHideExtension
{
public static readonly DependencyProperty VisibilityListenerProperty =
DependencyProperty.RegisterAttached(
"VisibilityListener",
typeof(bool),
typeof(AutoHideExtension),
new PropertyMetadata(false, VisibilityChanged));
public static double GetVisibilityListener(DependencyObject obj)
=> (double)obj.GetValue(VisibilityListenerProperty);
public static void SetVisibilityListener(DependencyObject obj, double value)
=> obj.SetValue(VisibilityListenerProperty, value);
private static void VisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = (FrameworkElement)d;
if (element.Visibility == Visibility.Collapsed || !IsLoaded)
{
return;
}
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Background)
{
Interval =
new TimeSpan(
0,
0,
ShowTime)
};
timer.Tick += (senderEvent, args) =>
{
element.Visibility = Visibility.Collapsed;
timer.Stop();
};
timer.Start();
}
}
Идея состоит в том, что я могу прикрепить это новое свойство к любому элементу и изменить видимость через указанное время, что-то вроде следующего:
<TextBlock Text="TextToHide"
helpers:AutoHideExtension.VisibilityListener="{Binding ChangesSavedEnabled}"/>
Проблема в том, что я не знаю, как указать ShowTime
как свойство в классе расширения, и что это просто не работает, так как не меняет Visibility
.
Любые идеи или предложения о том, как я могу продолжать двигаться вперед с этим?
Заранее спасибо!