所以这是我正在使用的场景:
我有一个当前表示为ItemsControl/ListView的优先级列表,绑定到可观察的优先级项集合.我想为元素重新排序提供严格视觉上受约束的垂直拖动.
所以,没有拖拽装饰,没有水平移动,只有垂直移动.当列表项移过另一个项的中点时,它应该通过动画"交换位置".我确信这可以通过在容器本身上使用mousedown/mousemove来完成,我确信可以应用渲染转换来执行此操作,但我理想的解决方案将包含两个组件:
该功能可以作为WPF交互行为附加.
该系统将是MVVM友好的,不需要任何重要的代码.
这已经完成了吗?我在哪里可以找到它?如果没有,我怎么能把所有的位放在一起才能做到这一点?
编辑:赏金开了.请通过评论直接向我提问,我会尽快回复.
我创建了一个usercontrol,其中包含Canvas和Canvas上的Button.为了能够在画布上移动按钮,我附加了一个如下所示的DragBehavior:
class DragOverCanvasBehavior : Behavior<FrameworkElement>
{
private Point _mouseStartPosition;
protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (sender, e) =>
{
_mouseStartPosition = e.GetPosition((Canvas) AssociatedObject.Parent);
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseLeftButtonUp += (sender, e) => AssociatedObject.ReleaseMouseCapture();
AssociatedObject.MouseMove += (sender, e) =>
{
var point = e.GetPosition((Canvas)AssociatedObject.Parent) - _mouseStartPosition;
if (AssociatedObject.IsMouseCaptured)
{
Canvas.SetTop(AssociatedObject, point.Y);
Canvas.SetLeft(AssociatedObject, point.X);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
出于商业原因,如果我按住并拖动画布,我也需要移动画布.我使用类似的Behavior类来改变Canvas边距并给它看起来好像它在拖动时随鼠标指针移动一样.此行为还捕获鼠标.
现在的问题是 - 如果我单击并拖动按钮,Canvas也会获取鼠标事件并开始被拖动.如何确保在拖动Button时Canvas Behavior不会获得鼠标事件.
我尝试在行为中放置e.Handled = true,但这不起作用.
如果我发现鼠标已经被捕获了一些其他对象,我可以在行为中设置条件,以便不再捕获它.
我已经实现了这里找到的附加命令行为模式,它可以很好地允许例如一个Border有一个在ViewModel中触发的左键或右键单击事件:
XAML:
<Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2"
c:CommandBehavior.Event="MouseLeftButtonDown"
c:CommandBehavior.Command="{Binding PressedLeftButton}"
c:CommandBehavior.CommandParameter="MainBorder123">
<TextBlock Text="this is the click area"/>
</Border>
Run Code Online (Sandbox Code Playgroud)
代码背后:
public ICommand PressedLeftButton { get; private set; }
public MainViewModel()
{
Output = "original value";
PressedLeftButton = new SimpleCommand
{
ExecuteDelegate = parameterValue => {
Output = String.Format("left mouse button was pressed at {0} and sent the parameter value \"{1}\"", DateTime.Now.ToString(), parameterValue.ToString());
}
};
}
Run Code Online (Sandbox Code Playgroud)
但是,如何将两个附加行为附加到一个元素,例如,我想要执行以下操作,但它当然会给我一个错误:
<Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2" …Run Code Online (Sandbox Code Playgroud) 我用谷歌搜索了这个问题,但无法收集任何信息,我想知道附加行为是否有可能处理附加事件?
我有一个在类中声明的事件和一个附加到 TextBox 控件的行为,单击按钮时将引发该事件。我在我的行为中添加了这个事件的处理程序并在事件处理程序中编写了逻辑,但它没有被执行。所以,我想知道附加行为是否有可能处理附加事件?
class ResetInputEventClass
{
public static readonly RoutedEvent ResetInputEvent = EventManager.RegisterRoutedEvent("ResetInput",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ResetInputEventClass));
public static void AddResetInputEventHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.AddHandler(ResetInputEventClass.ResetInputEvent, handler);
}
public static void RemoveResetInputEventHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.RemoveHandler(ResetInputEventClass.ResetInputEvent, handler);
}
}
Run Code Online (Sandbox Code Playgroud)
那是我的 Event 类,这就是我在行为中处理它的方式
public class MyBehavior : Behavior<TextBoxBase>
{
public MyBehavior()
{
// Insert …Run Code Online (Sandbox Code Playgroud)