caliburn winrt usercontrol并捕获自定义事件

时间:2013-07-01 13:13:09

标签: windows-runtime caliburn.micro

我使用一些自定义属性和一个自定义事件创建了自己的滑块作为用户控件。一切正常,但最近我开始使用Caliburn Micro,我不知道如何捕捉我的自定义事件。

以前我用过:

<my:RadialSlider x:Name="slider" WedgeAngle="270" ..... AngleChanged="slider_AngleChanged" />

public void slider_AngleChanged(object sender, ValueChangedEventArgs e)
{
.... something ....
}

现在,在Caliburn项目中,我尝试了:

<my:RadialSlider x:Name="slider" WedgeAngle="270" ..... cal:Message.Attach="[Event AngleChanged] = [Action slider_AngleChanged($eventArgs)]" />

并在我的ViewModel中:

public void slider_AngleChanged(object sender, ValueChangedEventArgs e)
    {
    .... something ....
    }

但是,这不起作用......

那么,如何捕获这个事件?

Slider UC代码隐藏:

public delegate void AngleChangedEventHandler(object sender, ValueChangedEventArgs e);

    public sealed partial class RadialSlider : UserControl
    {
public event AngleChangedEventHandler AngleChanged;

        private void OnAngleChanged(ValueChangedEventArgs e)
        {
            if (AngleChanged != null)
                AngleChanged(this, e);
        }

public static readonly DependencyProperty WedgeAngleProperty = DependencyProperty.Register("WedgeAngle", typeof(double), typeof(RadialSlider), new PropertyMetadata((double)270, new PropertyChangedCallback(OnPropertyWedgeAngleChanged)));
        public double WedgeAngle
        {
            get { return (double)this.GetValue(WedgeAngleProperty); }
            set { this.SetValue(WedgeAngleProperty, value); }
        }

private static void OnPropertyWedgeAngleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            (sender as RadialSlider).UpdateControls();
            if (e.NewValue != e.OldValue)
            {
                (sender as RadialSlider).OnAngleChanged(new ValueChangedEventArgs((double)e.OldValue, (double)e.NewValue));
            }
        }

}

1 个答案:

答案 0 :(得分:0)

您需要使用路由事件。这与事件如何冒泡视觉树以及Caliburn.Micro如何将自身附加到它们有关。使用Xaml的任何技术中的控件或UI小部件都应该避免标准事件,因为它们在一些非常时髦的功能(向上/向下冒泡)上松散。