2013-05-17 3 views
4

저는 DataGrid의 엔티티를 끌어서 놓기를 통해 DataGrid 엔티티에 할당하는 도구를 작성하고 있습니다.
약간의 손재주로, 나는 사소한 성가심과 함께 모든 것을 원활하게 수행 할 수 있습니다. 일부 엔티티는 UI에 반영되지 않은 다른 엔티티에 할당 될 수 없습니다 (아직).DataGridDragDropTarget : 놓기 대상에 따라 아이콘 변경

따라서 달성하고자하는 동작은 다음과 같습니다. 사용자가 다른 엔터티 위에 할당 된 개체를 드래그하면 해당 엔터티가 호환되지 않으면 아이콘이 "여기에서 드롭 할 수 없습니다"아이콘으로 변경되어야합니다 .

은 (대상 DataGridDataGridDragDropTarget.DragOver 이벤트에 부착) 내 코드입니다 :

private void DragDropTarget_OnDragOver(object sender, Microsoft.Windows.DragEventArgs e) 
{ 
    var sw = sender as DataGridDragDropTarget; 

    if (sw == null) 
    { 
     return; 
    } 

    if(GetAssignmentCondition(e)) 
    { 
     // TODO: Show link-icon 
    } 
    else 
    { 
     // TODO: Show drop-disabled-icon 
    } 
} 

지금까지 시도했다 :

내가 e.Effects, 설정 한 DragDropTargetAllowedSourceEffectsItemDragEventArgsAllowedEffectsEffects ~ DragDropEffects.None은 아무런 소용이 없습니다. 인터넷 검색도 의미있는 결과를 얻지 못했고 아이디어가 없습니다.

답변

2

이것은 TextBoxFlowDocument 컨트롤의 상황에서 도움이되므로 DataGrid과 함께 사용해야합니다.

여기서 핵심은 제어가 헛소리를하지 못하도록 이벤트를 Handled으로 설정하는 것입니다. 그래서 같은

뭔가 :

뒤에 코드 (단지 데모 - 바람직하게는 더 MVVM 친화적 인 솔루션을 사용) :

private void DragDropTarget_DragEnter(object sender, Microsoft.Windows.DragEventArgs e) 
{ 
    var sw = sender as DataGridDragDropTarget; 

    if (sw == null) 
    { 
     return; 
    } 

    if(GetAssignmentCondition(e)) 
    { 
     // TODO: Show link-icon 
     e.Effects = DragDropEffects.Link; 
    } 
    else 
    { 
     // TODO: Show drop-disabled-icon 
     e.Effects = DragDropEffects.None; 
    } 

    // Add this 
    e.Handled = true; 
} 
+0

불행히도, 'Preview *'이벤트는 실버 라이트에 존재하지 않습니다. 나는 e.Handled를 true로 설정하려고 시도 할 것이고, 이것이 도움이되는지를 볼 것입니다. – Nuffin

+0

'Handled'로 설정 했습니까? MS는 실제로 XAML을 사용하여 드래그 앤 드롭을 제대로 수행하지 못했지만 여러 가지 방법으로이 문제를 해결했습니다. 일반적으로 많은 고통이 따르므로 다른 사람들의 고통을 줄이려고합니다. (아주 명백한'Silverlight' 태그를 놓친 것에 대한 사과). – Gjeltema

+0

Works, thanks : D – Nuffin

1

Handled을 설정하지 않고 OnDragOver 이벤트 처리기에서 DragEventArgsEffects 속성을 변경 속성을 'true'로 설정하면 작동하지 않습니다. 여기서는 DragDropTarget.cs 소스 코드에서 볼 수 있습니다. 어떤 이벤트 핸들러에서 OnDragOver이 처리되지 않으면() args.Effectsargs.AllowedEffects으로 되돌아갑니다.

protected virtual void OnDragOver(SW.DragEventArgs args) 
    { 
     foreach (SW.DragEventHandler handler in _dragOver) 
     { 
      handler(this, args); 
      if (args.Handled) 
      { 
       return; 
      } 
     } 

     OnDragEvent(args); 
    } 

    protected virtual void OnDragEvent(SW.DragEventArgs args) 
    { 
     SW.DragDropEffects effects = args.AllowedEffects; 

     ///removed for clarity 

     if (!args.Handled && effects != args.AllowedEffects) 
     { 
      args.Effects = effects; // revert back to args.AllowedEffects 
      args.Handled = true; 
     } 
    }