Поведение для отмены / скрытия элемента Framework - PullRequest
1 голос
/ 09 апреля 2019

Я создал пользовательский 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.

Любые идеи или предложения о том, как я могу продолжать двигаться вперед с этим?

Заранее спасибо!

1 Ответ

1 голос
/ 09 апреля 2019

Ваше свойство зависимости VisibilityListener должно получить и установить значение bool:

public static bool GetVisibilityListener(DependencyObject obj)
    => (bool)obj.GetValue(VisibilityListenerProperty);

public static void SetVisibilityListener(DependencyObject obj, bool value)
    => obj.SetValue(VisibilityListenerProperty, value);

Затем вы можете определить другое прикрепленное свойство для ShowTime или Поведение смешивания , которое содержит два свойства:

<TextBlock xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
          Text="TextToHide">
    <i:Interaction.Behaviors>
        <local:AutoHideExtensionBehavior VisibilityListener="{Binding ChangesSavedEnabled}" ShowTime="3" />
    </i:Interaction.Behaviors>
</TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...