我有一个基于ToggleButton的自定义控件。在其构造函数中,我创建了一些type类型的元素,FrameworkElementFactory
并向其中一个分配了一个EventHandler,如下所示:
button.AddHandler(Ellipse.MouseDownEvent,新的MouseButtonEventHandler(Toggle));
这是我的事件处理程序:
private void Toggle(object sender, EventArgs e)
{
var active = GetTemplateChild("Active");
var button = GetTemplateChild("ToggleButton");
Storyboard sb = new Storyboard();
var ta = new ThicknessAnimation();
Storyboard.SetTargetProperty(ta, new PropertyPath("Margin"));
Storyboard.SetTarget(ta, button);
ta.Duration = TimeSpan.FromSeconds(0.2);
var da = new DoubleAnimation();
Storyboard.SetTargetProperty(da, new PropertyPath("Width"));
Storyboard.SetTarget(da, active);
da.Duration = TimeSpan.FromSeconds(0.2);
if ((bool)IsChecked)
{
ta.To = new Thickness(0);
da.To = (double)button.GetValue(Ellipse.WidthProperty);
IsChecked = !IsChecked;
}
else
{
ta.To = new Thickness(this.Width - (double)button.GetValue(Ellipse.WidthProperty), 0, 0, 0);
da.To = this.Width;
IsChecked = !IsChecked;
}
sb.Children.Add(ta);
sb.Children.Add(da);
sb.Begin();
}
但这是行不通的。从只工作一次的意义上讲不起作用。我的意思是应该根据IsChecked
属性设置滑块的宽度。最初,它设置为false
。当我单击它时,它会按预期扩展到右侧。但是,当我再次单击时,它没有按预期向左移动。
更令人惊讶的是,它与MouseEnter
事件完美配合。其他所有类似事件MouseDown/Up/LeftMouseButtonUp/PreviewMouseDown.....
也不起作用。
如果您想在不做大量编辑的情况下重现问题,请使用此处的代码。然后只需在WPF应用程序中使用它,您就会看到。
任何帮助,不胜感激。
编辑:另一个发现:它适用于右键单击和中键单击,但不适用于左键单击。想知道为什么...??我的鼠标工作正常。
编辑#2: 转换器
实现了几个自定义控件后,我发现了一些有趣的行为,特别是处理鼠标事件的行为。基本上,您可能会遇到另一个控件的情况,甚至在您ControlTemplate
获取鼠标事件之前,甚至在您正在窃取鼠标焦点并消耗鼠标事件的情况下。
有两种解决方法:
在这种情况下,我会InternalIsCheckedProperty
绑定一个,ToggleButton.IsCheckedProperty
以调用您的情节提要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句