Bir bırakma hedefi olarak bir öğeyle bir sürükleme hedefi algıladığında önizleme/bırakma olaylarının tetiklendiğini varsayalım. Bu durumda, bırakma hedefim bir metin kutusudur ve sürükleme hedefim bir etikettir. Her ikisi de DB'den dinamik olarak oluşturulur. DragAdorner'ı sürüklerken, DragAdorner'ı uygulamadan önce klonlamak için DragAdorner kullanıyorum, DnD'm iyi çalışıyor ancak dragadorner'ı kullandıktan sonra işe yaramaz. Ve ben hata ayıklamaya çalıştığımda önizleme olayımın ateş olmadığını fark ettim. i benim için çok karmaşıkWPF C# ÖnizlemeDrop/Bırak olayı tetiklenmedi (Dragadorner ile)
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;
} Ben http://www.adorkable.us/books/wpf_control_development.pdf (sayfa 103) görüldü
ama onun yol:
tbox.Drop += new DragEventHandler(tbox_PreviewDrop); // text box , Drop Target
tbox.DragOver += new DragEventHandler(tbox_DragOver);
Label lbl = new Label(); // Label , Drag Target
lbl.Content = s;
lbl.Width = Double.NaN;
lbl.Height = 40;
lbl.FontSize = 19;
lbl.PreviewMouseDown += new MouseButtonEventHandler(lbl_MouseDown);
lbl.PreviewMouseMove += new MouseEventHandler(lbl_MouseMove);
lbl.PreviewGiveFeedback += new GiveFeedbackEventHandler(lbl_GiveFeedback);
private void lbl_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(this);
// Mouse.OverrideCursor = Cursors.None;
}
private void lbl_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
// Mouse.OverrideCursor = Cursors.None;
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);
e.Handled = true;
}
}
private 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.Effects = DragDropEffects.Move;
e.Handled = true;
}
private void tbox_DragOver(object sender, DragEventArgs e)
{
e.Handled = true;
e.Effects = DragDropEffects.Move;
}
[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;
Ve adorner sınıf dosyası: Burada
benim kodlardır yeni biriyimDiğer olaylar ile çakışan GiveFeedBack olayım nedeniyle mi?
Merhaba, IsHitTestVisible = false ayarladı. Hala düşmeyecek. Maalesef, ikincil denemenizi düşürme girişimi ve – user2376998
no'lu sayfalarda tam olarak anlayamadım. Temel olarak WPF, imleç konumunda bir isabet testi yapacak ve en fazla öğenin üzerine düşmeye çalışacaktır. Bu eleman damla kabul etmezse, işlem iptal edilir. Bu yüzden 'Adorner'ınız üzerinde hit testinin devre dışı bırakılması önemlidir (Adorner her zaman üstte). –
Engellenmiş durumdayım, çalışmıyor, başka sorun var mı? – user2376998