我正在研究一个WPF应用程序的一部分,该应用程序需要在Thumb标签中包含许多控件,并且将有“井”只能接受特定的Thumb控件。我写了一个非常简单的例子来演示我正在使用的内容。
MainWindow.xaml
<Window x:Class="DragDropExample2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:DragDropExample2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Canvas>
<Thumb x:Name="Circle" Canvas.Right="10" Canvas.Top="20" DragDelta="Thumb_OnDragDelta">
<Thumb.Template>
<ControlTemplate>
<Ellipse x:Name="circleUI" Height="100" Width="100" Fill="Blue"/>
</ControlTemplate>
</Thumb.Template>
</Thumb>
<Ellipse x:Name="circleWell" Height="100" Width="100" Canvas.Left="10" Canvas.Bottom="20" StrokeThickness="1" Stroke="Black"/>
</Canvas>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Thumb_OnDragDelta(object sender, DragDeltaEventArgs e)
{
UIElement thumb = e.Source as UIElement;
Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange);
Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange);
}
}
所以,从本质上讲,我想做的是拥有拖动蓝色圆圈的动画,只能将它放在空白圆圈中,也就是当鼠标位于空心圆圈内时。将其放在页面上的任何其他位置会将其返回到其原始位置。我不知道是否有可能让Thumb控件保留的鼠标事件可供应用程序的其余部分访问。
我想要帮助的是检查控件(在本例中为circleWell)是否在Circle Thumb控件下,因此是一个有效的drop。否则将Circle返回到它的原点。
我想可能会做一个DragCompleted事件,将鼠标位置与目标值(Circle)的范围进行比较将是一个很好的方法,但如果它不在内,我可能会更喜欢它可接受的范围。如果无法防止掉线,我可以使用DragCompleted事件。如果鼠标的坐标不在circleWell边界内,我想要的工作流程将返回Circle的起始位置,否则,如果Circle在可接受的范围内,我希望它(圆圈)“捕捉”以覆盖容器控件( circleWell)。
答案 0 :(得分:0)
通过创建单击控件的自定义光标,拖放基于布尔值。