2011-04-14 3 views
2

마우스 버튼을 누르고있는 동안 WPF ListBox가 MouseMove 이벤트를 가져 오면 목록 상자의 선택이 변경됩니다. 즉, 항목 # 1에서 마우스를 클릭 한 다음 항목 # 2 위로 드래그하면 항목 # 1이 선택 취소되고 항목 # 2가 대신 선택됩니다. 어떻게 이것을 막을 수 있습니까?레이아웃을 변경할 때 WPF ListBox가 마우스로 항목을 선택하지 못하도록합니다.

짧은 버전입니다. 좀 더 긴 버전은 다음과 같습니다. 사용자가 ListBox에서 항목을 두 번 클릭하면 ListBox 위에 다른 컨트롤을 표시하는 등 내 레이아웃을 다른 방식으로 변경합니다. 이렇게하면 ListBox가 아래쪽으로 이동합니다. 즉 사용자가 두 번 클릭했을 때와 다른 ListBoxItem 위에 마우스가 놓이게됩니다.

DoubleClick 이벤트 (마우스 다운 이벤트)에 대한 응답으로 이러한 레이아웃을 변경 했으므로이 레이아웃 변경이 완료 될 때 마우스 단추가 여전히 눌러져있을 가능성이 매우 높습니다. 즉, WPF는 ListBox MouseMove 이벤트 (ListBox를 기준으로 마우스의 위치가 변경된 이후) ListBox는 이것을 드래그로 처리하고 마우스 아래에있는 이벤트를 선택합니다.

두 번 클릭 이벤트가 발생하는 시간과 사용자가 마우스를 놓은 시간 (레이아웃이 변경된 후) 사이에서 선택 사항을 변경하지 않으려합니다. 나는 이것을 달성하는 가장 간단한 방법은 "드래그에 대한 선택 변경"동작을 비활성화하는 것이지만 다른 제안에 대해서는 개방적이라고 생각합니다.

더블 클릭으로 선택을 "고정"하고 마우스 업까지 변경할 수 없게하려면 어떻게해야합니까?

답변

13

ILSpy을 파고 들자 드래그 앤 드롭 동작을 사용하지 않는 속성이 없으며 처리를 중지 할 수있는 이벤트가 없습니다.

그러나이 동작을 변경하기위한 좋은 변곡점이 있습니다. ListBoxItem.OnMouseEnter는 가상이며 목록 상자로 다시 호출하여 선택 항목을 변경합니다. 그것은 본질적으로 다른 것을하지 않는 것처럼 보이므로, 나는 그것을 무시하고 아무것도하지 않아도됩니다.

편집 : 위의 내용은 목록 상자 안에서 마우스를 움직일 때만 선택 항목이 변경되는 것을 방지합니다. 목록 상자의 위 또는 아래로 마우스를 움직이면 자동 스크롤이 시작되어 선택 항목을 움직이면 도움이되지 않습니다. 자동 스크롤 코드의 대부분은 다시 가상이 아닌 메소드입니다. 자동 스크롤을 막는 가장 좋은 방법은 마우스 캡처를 사용하지 않도록 설정하는 것입니다. ListBoxItem에 대한 또 다른 재정의는 이것을 처리 할 수 ​​있습니다.

내 자신의 ListBoxItem 하위 항목을 사용하는 가장 좋은 방법은 ListBox에서 파생되는 것입니다. 최종 코드는 다음과 같습니다.

public class ListBoxEx : ListBox 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new ListBoxExItem(); 
    } 
    protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return item is ListBoxExItem; 
    } 
} 
public class ListBoxExItem : ListBoxItem 
{ 
    private Selector ParentSelector 
    { 
     get { return ItemsControl.ItemsControlFromItemContainer(this) as Selector; } 
    } 

    protected override void OnMouseEnter(MouseEventArgs e) 
    { 
    } 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonDown(e); 
     ParentSelector?.ReleaseMouseCapture(); 
    } 
} 
+0

목록 항목의 드래그 작업 중에 선택 변경 사항을 해결하는 데 도움이되었습니다. 감사. –

+0

마우스 다운 이벤트에서 선택한 항목을 제거하면'ParentSelector'가'null'이됩니다. 이 문제를 해결하기 위해'ParentSelector? .ReleaseMouseCapture()'null 체크를 사용할 수 있습니다. – J3soon

+0

@ J3 순 추천. 업데이트 됨. –