2017-09-11 12 views
-1

내 UI에 놓기 작업을 수행 할 수있는 표/패널이 있습니다. 컨트롤은 그 안에 동적으로 생성 된 일부 내용이있는 그리드입니다 (중요한 경우 테두리의 스택 패널을 포함하는 뷰 박스).IsMouseOver 및 DragLeave가 제대로 작동하지 않습니다.

관련 정보를 그리드로 드래그하면 내부 내용을 변경 (재생성)하고 싶을 때 드롭하거나 놓아두면 정상으로 돌아갑니다. 나는 '변경'과 '다시 돌려 놓기'방법을 잘 사용하고 있지만, 언제 호출해야하는지 결정하는 데 어려움을 겪고있다.

나는 그리드에 드래그 이벤트를 끌어다 놓습니다. 들어가는 것은 훌륭하지만 휴가는하지 않습니다. 마우스가 그리드 안의 내용 위에 마우스를 올리 자마자 드래그 앤드 이벤트가 발생하여 내용을 변경합니다 (자식 콘텐트에서 다시 꺼내면 드래그가 다시 시작되고 깜박입니다) .

내 첫 번째 생각은 마우스가 실제로 눈금 위에 아직 있는지를 확인하고 내용을 다시 넣지 않고 그냥 버리는 것입니다. 그러나 이것은 작동하지 않는 것 같습니다. 여기에 드래그 휴가에 대한 내 코드입니다 :

 private void Grid_DragLeave(object sender, DragEventArgs e) 
    { 
     var wizard = DataContext as WizardVM; 
     var gd = sender as Grid; 

     if (wizard == null || gd == null || gd.IsMouseOver || 
      gd.Children.Cast<FrameworkElement>().Any(x => x.IsMouseOver)) return; 

     wizard.Assembly.CollapsePreview(); 
    } 

당신이 볼 수 있듯이, 나는 심지어 그리드의 자식을 반복하고 이상 마우스가 그 중 하나에 해당하는 경우보고 밖으로 도랑했는데, 아직도 그냥 유지 그 모든 것에 대해 false를 반환하고 접습니다. 나는 IsMouseOver가 비록 그것이 비록 통제의 아이들이라 할지라도 마우스가 완전히 끝났다고 말해야한다고 생각했다. ...

+0

Winforms, WPF, ASP ..는 무엇을 목표로 삼고 있습니까? __ 항상 뚜껑을 달아주세요. – TaW

+0

IsMouseOver는 true가 아닙니다. 정상적인 마우스 조작은 D + D 조작이 진행되는 동안 일시 중단됩니다. 아무도이 스 니펫에서 대안을 제안 할 수있는 방법을보기가 어렵습니다. –

+0

죄송합니다. WPF입니다. 그래서 한스 (Hans)는 마우스가 그리드의 경계에 있는지 여부를 알려주는 방법이 없다고 말하고 있습니까? – sfaust

답변

0

잘 연구를 한 후에 나는 잘 작동하는 것으로 생각했다. VisualTreeHelper.HitTest를 사용하고 콜백이있는 과부하를 사용하고 모호한 경우에도 모든 히트 항목을 가져와야했습니다. 다음,

void Grid_DragLeave(object sender, DragEventArgs e) 
    { 
     var wizard = DataContext as WizardVM; 
     var gd = sender as Grid; 

     if (wizard == null || gd == null) return; 
     Point pt = e.GetPosition(this); 
     hitResults.Clear(); 
     VisualTreeHelper.HitTest(gd, null, GridHitTestResultCallback, 
      new PointHitTestParameters(pt)); 

     if (!hitResults.Contains(gd)) 
     { 
      wizard.Assembly.IsExpanded = false; 
     } 
    } 

    HitTestResultBehavior GridHitTestResultCallback(HitTestResult result) 
    { 
     hitResults.Add(result.VisualHit); 
     return HitTestResultBehavior.Continue; 
    } 

는 기본적으로 전체 화면을 기준으로 한 점을 얻는다 그 시점과 내가 함께 작동하도록 노력하고있어 전체 그리드 그러나 hitTest 전화 : 여기 내 마지막 코드입니다. 콜백은 적중 테스트에서 적중 한 비주얼 목록을 채 웁니다. 마지막으로 원본 메서드는 눈금 목록에 눈금이 있는지 확인하고 그렇지 않은 경우 눈금이 축소됩니다. 누군가가 그 변화에 의해 혼동하고 싶지 않았다 나는 또한 .ExpandPreview()와 .CollapsePreview() 관련이없는 이유로 .IsExpanded 재산에 대한 방법을 변경 보조 노트 ...로

...