我用一拖裝飾器克隆我的標籤(拖動目標),但現在卻我不能我的標籤拖放到我的文本框的圖像,拖放與拖放裝飾器
這是我使用的代碼(U可能會看到那裏有previewdragover,我寫了e.Handled = true在previewdragover但並不能幫助)我還設置tbox.AllowDrop爲true:
文本框:
tbox.PreviewDrop += new DragEventHandler(tbox_PreviewDrop);
tbox.PreviewDragOver += new DragEventHandler(tbox_PreviewDragOver);
處理程序文本框:
protected void tbox_PreviewDrop(object sender, DragEventArgs e)
{
(sender as TextBox).Text = string.Empty; // Empty the textbox from previous answer.
(sender as TextBox).Background = Brushes.White;
e.Handled = true;
}
標籤(拖動目標):
Label lbl = new Label();
lbl.Content = s;
lbl.Width = Double.NaN;
lbl.Height = 40;
lbl.FontSize = 19;
lbl.MouseDown += new MouseButtonEventHandler(lbl_MouseDown);
lbl.MouseMove += new MouseEventHandler(lbl_MouseMove);
lbl.GiveFeedback += new GiveFeedbackEventHandler(lbl_GiveFeedback);
lbl.MouseUp += new MouseButtonEventHandler(lbl_MouseUp);
wrapPanel2.Children.Add(lbl);
處理程序標籤:
private void lbl_MouseUp(object sender, MouseButtonEventArgs e)
{
Mouse.OverrideCursor = Cursors.Arrow;
}
private void lbl_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(this);
}
private void lbl_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var source = sender as UIElement;
Label lbl = sender as Label;
Point current = e.GetPosition(this);
Vector diff = startPoint - current;
if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
adorner = new DragAdorner(lbl, e.GetPosition(lbl));
AdornerLayer.GetAdornerLayer(lbl).Add(adorner);
var dragData = new DataObject(this);
DragDrop.DoDragDrop(source, dragData, DragDropEffects.Copy);
AdornerLayer.GetAdornerLayer(lbl).Remove(adorner);
}
startPoint = current;
}
}
private void lbl_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
if (adorner != null)
{
Label lbl = sender as Label;
var pos = lbl.PointFromScreen(GetMousePosition());
adorner.UpdatePosition(pos);
}
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);
[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
public Int32 X;
public Int32 Y;
};
public static Point GetMousePosition()
{
Win32Point w32Mouse = new Win32Point();
GetCursorPos(ref w32Mouse);
return new Point(w32Mouse.X, w32Mouse.Y);
}
private Point startPoint;
private DragAdorner adorner;
現在我可以用拖動標籤下我的光標標籤,但我不能在任何拖放文本框。
-----編輯------------
我已經把在dragenter的文本框是這樣的:
private void tbox_PreviewDragEnter(object sender, DragEventArgs e)
{
if (sender == e.Source)
{
e.Effects = DragDropEffects.None;
}
}
仍然沒有工作壽。
我會在這裏添加DragAdorner.cs,我用(我從一些中國網站得到了它):
public class DragAdorner : Adorner {
public DragAdorner(UIElement adornedElement, Point offset)
: base(adornedElement) {
this.offset = offset;
vbrush = new VisualBrush(AdornedElement);
vbrush.Opacity = .7;
}
public void UpdatePosition(Point location) {
this.location = location;
this.InvalidateVisual();
}
protected override void OnRender(DrawingContext dc) {
var p = location;
p.Offset(-offset.X, -offset.Y);
dc.DrawRectangle(vbrush, null, new Rect(p, this.RenderSize));
}
private Brush vbrush;
private Point location;
private Point offset;
以前我用裝飾器,我拖和拖放效果很好。我在我的文本框中有預覽和dragover,但我真的需要我的文本框DragEnter處理程序?因爲它表示當輸入系統報告一個將此元素作爲拖動目標的基礎事件時發生,我的文本框是放置目標... – user2376998
這是否與我的DragAdorner.cs有關?因爲有時當我拖動目標時,我用鼠標移動得非常快,光標有時會顯示掉符號,但大部分時間是默認光標,它是中間有一條線的黑色圓圈 – user2376998
我仍然認爲它是因爲你沒有將'e.Effects'設置爲有效值......你添加了一個編輯,但是設置了'e.Effects = DragDropEffects.None;'。這就像取消你的拖放操作。您需要根據您的意願和'DragEventArgs'實例的'e.AllowedEffects'屬性的值將其設置爲'DragDropEffects.Copy'或'DragDropEffects.Move'。另外,我不知道你爲什麼把它放到'tbox_PreviewDragEnter'處理程序中......我說要從'PreviewDrop'或'PreviewDragOver'事件處理程序(放置目標*的*)調用它。 – Sheridan