Windows runtime caliburn winrt usercontrol和捕获自定义事件
我制作了自己的滑块作为用户控件,带有一些自定义属性和一个自定义事件。一切正常,但最近我开始使用Caliburn Micro,我不知道如何捕获自定义事件 我以前用过:Windows runtime caliburn winrt usercontrol和捕获自定义事件,windows-runtime,caliburn.micro,Windows Runtime,Caliburn.micro,我制作了自己的滑块作为用户控件,带有一些自定义属性和一个自定义事件。一切正常,但最近我开始使用Caliburn Micro,我不知道如何捕获自定义事件 我以前用过: <my:RadialSlider x:Name="slider" WedgeAngle="270" ..... AngleChanged="slider_AngleChanged" /> 现在,在Caliburn项目中,我尝试: <my:RadialSlider x:Name="slider" WedgeAngl
<my:RadialSlider x:Name="slider" WedgeAngle="270" ..... AngleChanged="slider_AngleChanged" />
现在,在Caliburn项目中,我尝试:
<my:RadialSlider x:Name="slider" WedgeAngle="270" ..... cal:Message.Attach="[Event AngleChanged] = [Action slider_AngleChanged($eventArgs)]" />
但是,这不起作用
那么,如何捕捉这一事件呢
滑块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));
}
}
}您需要使用路由事件。这与事件如何在视觉树上冒泡以及Caliburn.Micro如何将自身连接到它们有关。任何技术中的控件或UI小部件都应该避免使用标准事件,使用Xaml作为一些非常时髦的功能(气泡上升/下降)。正常,我将用示例更新帖子您的事件是RoutedEvent还是普通.NET事件?试着使用RoutedEvent或RoutedEvent,看看它是否有效,这可能是因为触发器假定事件是路由的。
public void slider_AngleChanged(object sender, ValueChangedEventArgs e)
{
.... something ....
}
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));
}
}