다른 도크 옵션에 너무 많은 자식 창이있는 응용 프로그램에서 작업하고 있습니다. 따라서 하나의 도크에는 사용자가 선택한 엔티티의 속성을 수정할 수있는 속성 패널 창이 있으며 컨트롤 맨 아래에서 사용할 수있는 적용 버튼을 클릭해야하는 값을 변경하면됩니다. 따라서 사용자가 일부 값을 수정하고 적용을 클릭하는 대신 속성 패널보기의 하위 컨트롤과 별도로 사용자가 다른 곳을 클릭하면 사용자에게 "처음 클릭하십시오."라는 메시지가 표시되어야하는 일종의 기능이 있습니다. 변경 사항 저장 "을 선택하십시오. 이 작업을 위해 MainWindow의 마우스 다운 이벤트에서 다음 코드를 작성했습니다.wpf의 콤보 상자 선택에 의한 이상한 동작
private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
var hitObject = this.InputHitTest(e.GetPosition(this)) as DependencyObject;
if (hitObject.FindVisualAncestor<PropertyPanelUserControl>() == null)
{
MessageBox.Show("Please save your changes");
}
}
따라서, 논리가 메인 윈도우의 아래로 마우스, 이것이다, 히트 개체를 가져오고 해당 속성 패널 컨트롤의 자식 컨트롤 인 경우, 다음이 부모와 다른 컨트롤로 PropertyPanelUserControl있을 것이라는 점을 확인 PropertyPanelUserControl의 일부 또는 하위 컨트롤이 아닌 경우 사용자는 적용을 클릭하라는 메시지가 표시됩니다.
위 코드 조각은 훌륭하게 작동했지만 이상한 문제가 발생했습니다. 속성 패널에 1에서 10까지의 항목이있는 콤보 상자가있었습니다. 따라서 사용자가 다른 값으로 변경하려고하면 값을 입력하면 사용자에게 해당 메시지가 표시되지 않습니다. 지금까지 사용자가 속성 패널 컨트롤을 클릭하고 콤보 상자에서 항목을 선택한 후 마우스 아래쪽 이벤트에서 적중 한 개체를 확인한 후 개체가 chromeButton 또는 콤보 박스. 하지만 마지막 항목 10을 선택하면 오브젝트가 히트 오브젝트가 속성 패널 컨트롤이있는 테두리로 나타납니다.
<Border><View:PropertyPanelControl/></Border>
이상의 확인은 실패합니다. 테두리에는 속성 패널 컨트롤로 조상이 없으므로 테두리가 컨트롤의 조상입니다. 따라서 사용자는 콤보 상자 값을 변경하는 동안에도 메시지를받습니다. 또한 콤보 상자 항목을 클릭하지 않았 음을 확인했습니다. 이제 wpf가이 이상한 방식으로 작동하는 이유는 무엇입니까? 이 문제를 해결하십시오.
을, 난 내가 마지막 요소 이외의 콤보 상자에서 항목을 선택하면, 그것은 나에게 combbox을 제공하지만, 마지막 요소는 국경 제어 할 수 있음을 말하고, 당신이 오해 생각하는 속성 패널 컨트롤이 필요합니다 .... –
실제로, 내가 실수로 그 문제를 적절하게 설명 할 수는 없었다. ... –
아니, 나는 오해하지 않았다. 나의 요점은 작은 부분들로 구성된 UI 요소를 클릭 할 때이다. , 실제로 작은 부분 (예 : '테두리')을 클릭 할 수 있습니다. 그러나 'Border'는 여전히 상위 컨트롤의 일부입니다. 따라서 시각적 트리를 위아래로 이동하고 포함 된 컨트롤을 찾을 수 있어야합니다. 아마도 CodeProject의 [WPF에서의 시각 트리 및 논리 트리 이해] (http://www.codeproject.com/Articles/21495/Understanding-the-Visual-Tree-and-Logical-Tree-in) 문서를 읽는 것이 도움이 될 수 있습니다 너는 이것을 더 잘 이해할 수있다. – Sheridan