Поведение для отображения/скрытия элемента Framework

Я создал пользовательский TextBlock, который меняет Visibility через несколько секунд, указанных DependencyPropertyShowTime:

<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 as в классе расширения, и это просто не работает, так как не изменяет Visibility.

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

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

Определите другое присоединенное свойство для ShowTime.

mm8 09.04.2019 15:23

Я уже пробовал, но пишет, что не может получить доступ к GetValue или SetValue, нужно ли мне наследовать от какого-либо специального объекта?

Nekeniehl 09.04.2019 15:24

Ваше свойство зависимостей VisibilityListener должно получить и установить логическое значение, а не двойное.

mm8 09.04.2019 15:25

Вам нужно время как свойство или это действительно заданное значение, например 5 секунд или что-то в этом роде?

Andy 09.04.2019 15:27

:facepalm: хороший момент @mm8, который решает часть, которая не работала в отношении Visibility, но я все еще не могу создать DP для установки свойства ShowTime

Nekeniehl 09.04.2019 15:30

Не совсем @andy, но я хотел бы научиться, я могу установить значение по умолчанию 3 или 5 секунд, и работа будет выполнена, но я ничему не научусь =D

Nekeniehl 09.04.2019 15:30

Я думал, что вы могли бы использовать элемент фреймворка конвертера и привязать видимость. Вы можете поместить свойство в то, что может быть установлено, но не привязано.

Andy 09.04.2019 15:31

Как насчет Behavior в этом случае?

Pavel Anikhouski 09.04.2019 15:31

@Nekeniehl: Просто скопируйте первый и измените тип на int? Кстати, смотрите мой ответ о поведении Blend.

mm8 09.04.2019 15:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше свойство зависимостей 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>

Как вы думаете, как перейти на MVVM? Я считаю поведение не так ли?

Nekeniehl 09.04.2019 15:40

@Nekeniehl: как присоединенное поведение, так и смешанное поведение подходят для MVVM. Какой подход использовать, зависит от ваших требований. Поведения смешивания нельзя использовать, например, в установщиках стилей, но они обеспечивают лучшую инкапсуляцию.

mm8 09.04.2019 15:43

Другие вопросы по теме