2009-08-12 7 views
2

WPF Popup을 사용하고 있지만 응용 프로그램이 최소화되어 있어도 데스크탑의 모든 단일 창 위에 팝업됩니다. 원래 창에서만 유지할 수 있습니까? 내 윈도우가 다른 윈도우 뒤에있을 때도 똑같은 일이 발생합니다. 팝업이 모두 위에 표시됩니다.WPF Popup ZOrder

"뭔가 할 수 있어야합니다!"

감사합니다.

+0

동일한 문제가 있으며 해결할 수 없습니다. 이것이 기본 동작이라고 생각하기는 어렵지만 MSDN은이 점에서 쓸모없는 것 이상입니다. 해결 방법은 comboBox가 포함 된 전체 창을 xaml 창에서 TopMost = True로 설정하는 것입니다. 그게 내 ComboBox (팝업 경우와 동일)의 드롭 다운뿐만 아니라 전체 윈도우를 최상으로 만듭니다. – pixel

답변

3

나는이 문제도 해결하려고 노력했지만 좋은 해결책을 찾지 못했습니다. 이것은 그것이 작동하도록되어있는 방법 인 것처럼 보입니다. 그리고 그것을 무시할 수는 없습니다.

제가 생각해 낸 유일한 해결책은 일반 레이아웃 패널을 사용하여 Z- 인덱스를 올리는 것입니다. 그래서 최상위 컨트롤입니다 (이 종류의 팝업을 시뮬레이트합니다). WindowsFormsHosts를 통해 화면에 WinForms가있을 때만 작동합니다. 그 Winforms는 항상 WPF 물건보다 높은 Z- 색인에 있습니다. 팝업을 사용하여 주위를 둘러 봐야 할 때입니다.

0

필자도 시도하지는 않았지만, 필자도이 기능을 사용할 수 있다고 읽었습니다 ... Matt Galbraith는 MSDN 포럼에서 같은 질문을 받으면 제안했습니다. 이 스레드를 읽고.

7

그래서 프레임 워크 소스 코드를 통해 실제로 창이 최상위가되는 위치를 확인하고 개인 중첩 클래스에서이를 수행합니다. 그러나, 그것은 메인 윈도우의 자식 팝업이거나 최상위 윈도우가 될 수있는 옵션을 제공하지 않습니다. 다음은 항상 자식 팝업 창을 만들기위한 해킹입니다. 하나는 쉽게 의존성 속성을 추가 할 수 있고 더 많은 마법을 사용하여 가장 많이 사용하게 만들 수 있습니다.

using System; 
using System.Reflection; 
using System.Windows; 
using System.Windows.Controls.Primitives; 

namespace UI.Extensions.Wpf.Controls 
{ 
    public class ChildPopup : Popup 
    { 
     static ChildPopup() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(ChildPopup), new FrameworkPropertyMetadata(typeof(ChildPopup))); 
     } 

     public ChildPopup() 
     { 
      Type baseType = this.GetType().BaseType; 
      dynamic popupSecHelper = GetHiddenField(this, baseType, "_secHelper"); 
      SetHiddenField(popupSecHelper, "_isChildPopupInitialized", true); 
      SetHiddenField(popupSecHelper, "_isChildPopup", true); 
     } 

     protected dynamic GetHiddenField(object container, string fieldName) 
     { 
      return GetHiddenField(container, container.GetType(), fieldName); 
     } 

     protected dynamic GetHiddenField(object container, Type containerType, string fieldName) 
     { 
      dynamic retVal = null; 
      FieldInfo fieldInfo = containerType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); 
      if (fieldInfo != null) 
      { 
       retVal = fieldInfo.GetValue(container); 
      } 
      return retVal; 
     } 

     protected void SetHiddenField(object container, string fieldName, object value) 
     { 
      SetHiddenField(container, container.GetType(), fieldName, value); 
     } 

     protected void SetHiddenField(object container, Type containerType, string fieldName, object value) 
     { 
      FieldInfo fieldInfo = containerType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); 
      if (fieldInfo != null) 
      { 
       fieldInfo.SetValue(container, value); 
      } 
     } 
    } 
} 
+1

ChildPopup에서 상속해야하는 경우 코드가 그대로 작동하지 않습니다. popupSecHelper 줄을 다음으로 변경했습니다. object popupSecHelper = GetHiddenField (this, typeof (Popup), "_secHelper"); 또한 필요하지 않은 것처럼 DefaultStyleKeyProperty 재정의를 건너 뛴 이유는 알 수 없습니다. – TGasdf