Моя цель: У меня есть Button
и Image
. Image
будет Hidden
по умолчанию и как только пользователь Наведите указатель мыши на Button
, Image
должен быть показан. Он должен быть видимым, пока пользователь не опустит мышь над Image
или Button
. Он должен скрывать изображение через 6 секунд, когда пользователь покидает точку мыши (либо с кнопки, либо с изображения). Мышь снова навешивается до 6 секунд, а оставить следует перезапустить таймер.Скрыть видимость элемента через n секунд с использованием свойства зависимостей
Что я пытался У меня уже есть работоспособное решение с использованием AttachedProperty
, но это не эффективно. Я чувствую, что здесь будет утечка памяти из-за static
.
public class MouseHoverBehavior
{
public static readonly DependencyProperty ElementProperty = DependencyProperty.RegisterAttached(
"Element", typeof(UIElement), typeof(MouseHoverBehavior), new UIPropertyMetadata(OnElementChanged));
private static UIElement target;
static MouseHoverBehavior()
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(6);
timer.Tick += Timer_Tick;
}
private static void OnElementChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var element = (sender as Button);
target = (UIElement)e.NewValue;
target.Visibility = Visibility.Hidden;
element.MouseEnter += Element_MouseEnter;
target.MouseEnter += Element_MouseEnter;
element.MouseLeave += Element_MouseLeave;
target.MouseLeave += Element_MouseLeave;
}
private static DispatcherTimer timer;
private static void Element_MouseLeave(object sender, MouseEventArgs e)
{
timer.Start();
}
private static void Timer_Tick(object sender, EventArgs e)
{
target.Visibility = Visibility.Hidden;
}
private static void Element_MouseEnter(object sender, MouseEventArgs e)
{
timer.Stop();
target.Visibility = Visibility.Visible;
}
public static void SetElement(DependencyObject element, UIElement value)
{
element.SetValue(ElementProperty, value);
}
public static string GetElement(DependencyObject element)
{
return (string)element.GetValue(ElementProperty);
}
}
В XAML:
<StackPanel>
<Image Source="steve.jpg" Width="200" x:Name="image"/>
<Button Width="200" Height="100" Margin="20" local:MouseHoverBehavior.Element="{Binding ElementName=image}"/>
</StackPanel>
ли кто-нибудь иметь лучшее представление о том, делать это эффективно.
Спасибо.
Вы настроены на выполнение этого в коде? Я могу показать вам, как с помощью раскадровки, но чистый xaml более знаком мне в том, как это сделать. –
@ Крис. , Да, пожалуйста. Это будет действительно здорово, если вы можете дать мне только в xaml. – Gopichandar