Как я могу обрабатывать события в моем пользовательском элементе управления? - PullRequest
0 голосов
/ 21 марта 2010

Я не хочу создавать новые события. Мне нужно создать элемент управления Canvas, который по выбору может исчезать или увеличиваться в зависимости от того, находится ли мышь над ним или нет. Приведенный ниже код, вероятно, объясняет, что я хочу сделать лучше, чем могу.

        private Storyboard fadeInStoryboard;
    private Storyboard fadeOutStoryboard;
    public FadingOptionPanel()
    {
        InitializeComponent();
    }
    public static readonly DependencyProperty FadeEnabledProperty =
    DependencyProperty.Register("IsFadeEnabled", typeof(bool), typeof(FadingOptionPanel), new FrameworkPropertyMetadata(true,
                   OnFadeEnabledPropertyChanged,
                   OnCoerceFadeEnabledProperty));
    public bool IsFadeEnabled
    {
        get
        {
            return (bool)GetValue(FadeEnabledProperty);
        }
        set
        {
            SetValue(FadeEnabledProperty, value);
        }
    }
    private static void OnFadeEnabledPropertyChanged(DependencyObject source,
    DependencyPropertyChangedEventArgs e)
    {

    }
    private static object OnCoerceFadeEnabledProperty(DependencyObject sender, object data)
    {
        if (data.GetType() != typeof(bool))
        {
            data = true;
        }
        return data;
    }

    private void FadingOptionPanel_MouseEnter(object sender, MouseEventArgs e)
    {
        if (IsFadeEnabled)
        {
            fadeInStoryboard.Begin(this);
        }
    }
    private void FadingOptionPanel_MouseLeave(object sender, MouseEventArgs e)
    {
        if (IsFadeEnabled)
        {
            fadeOutStoryboard.Begin(this);
        }
    }
    private void FadingOptionsPanel_Loaded(object sender, RoutedEventArgs e)
    {
        //Initialize Fade In Animation
        DoubleAnimation fadeInDoubleAnimation = new DoubleAnimation();
        fadeInDoubleAnimation.From = 0;
        fadeInDoubleAnimation.To = 1;
        fadeInDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(.5));
        fadeInStoryboard = new Storyboard();
        fadeInStoryboard.Children.Add(fadeInDoubleAnimation);
        Storyboard.SetTargetName(fadeInDoubleAnimation, this.Name);
        Storyboard.SetTargetProperty(fadeInDoubleAnimation, new PropertyPath(Canvas.OpacityProperty));

        //Initialize Fade Out Animation
        DoubleAnimation fadeOutDoubleAnimation = new DoubleAnimation();
        fadeOutDoubleAnimation.From = 1;
        fadeOutDoubleAnimation.To = 0;
        fadeOutDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(.2));
        fadeOutStoryboard = new Storyboard();
        fadeOutStoryboard.Children.Add(fadeOutDoubleAnimation);
        Storyboard.SetTargetName(fadeOutDoubleAnimation, this.Name);
        Storyboard.SetTargetProperty(fadeOutDoubleAnimation, new PropertyPath(Canvas.OpacityProperty));
    }

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

1 Ответ

1 голос
/ 21 марта 2010

Один из способов - переопределить соответствующие методы OnXxx.Например:

protected override void OnMouseEnter(MouseEventArgs e)
{
  base.OnMouseEnter(e);
  if (IsFadeEnabled)
  {
    fadeInStoryboard.Begin(this);
  }
}

Вы также можете добавить подписку на событие в своем конструкторе:

public FadingOptionPanel()
{
  this.MouseEnter += FadingOptionPanel_MouseEnter;
}

Обратите внимание, что для запуска раскадровки на событии вы часто можете сделать это без кода.позади с помощью EventTriggers - но я не уверен, что можно было бы применить подход на основе EventTrigger для уважения вашего свойства IsFadeEnabled.

...