ポップアップを使用するウィンドウがあります。ポップアップは、仕様で要求されているように開いたままになるように設定されています。このウィンドウは、新しいモーダルウィンドウも起動します。私が抱えている問題は、新しいモーダルウィンドウが元のウィンドウの一番上に表示されますが、ポップアップは表示されないことです。ポップアップはすべての上に表示され、すべてが非常に奇妙に見えます。
3 に答える
AdrianFaciuが言及したNonTopmostPopupにはかなりの幸運がありました。これは親ウィンドウに対してのみ最上位にあるため、モーダルウィンドウが実際に新しいものであると仮定するとWindow
(1つのように見える別のコントロールだけでなく)、正常に機能するはずです。思い出すと、それに関するわずかな問題は、その前にドラッグされているWindowsなどに応じて、非常に時折のちらつきや更新期間でした(しかし、それを使用しないことは私にとって十分な問題ではありませんでした)。
ポップアップは、アクセス許可のために2番目のウィンドウを開くことができない(または、何らかの方法でセキュリティ警告が表示される)XBAPで非常に役立つコントロールであり、ポップアップはメッセージボックスを表示する便利な方法です。通常のWPFで作業している場合は、ポップアップの代わりに通常のウィンドウ(必要に応じてWindowStyle.Noneを使用)を使用することをお勧めします。
そうは言っても、私が知る限り、ポップアップは常に一番上に表示され、これを回避する方法は見つかりませんでした。
参照:: http ://social.msdn.microsoft.com/Forums/en/wpf/thread/7467957a-08e9-4e9b-a03f-51c79a94bccb
public class PopupParentWindowFocusBehavior : Behavior<Popup>
{
private bool _hidden;
private UIElement _lastPlacementTarget;
private System.Windows.Window _lastWindow;
private PropertyChangeNotifier _placementTargetNotifier;
protected override void OnAttached()
{
base.OnAttached();
InitializeForPlacementTarget();
_placementTargetNotifier = new PropertyChangeNotifier(AssociatedObject, Popup.PlacementTargetProperty).AddValueChanged(OnPlacementTargetChanged);
}
protected override void OnDetaching()
{
base.OnDetaching();
DetachWindowEvents();
if (_lastPlacementTarget != null)
{
((Control)_lastPlacementTarget).Loaded -= OnPlacementTargetLoaded;
}
_placementTargetNotifier.ValueChanged -= OnPlacementTargetChanged;
}
private void OnPlacementTargetChanged(object sender, EventArgs e)
{
InitializeForPlacementTarget();
}
private void InitializeForPlacementTarget()
{
if (_lastPlacementTarget != null)
{
((Control)_lastPlacementTarget).Loaded -= OnPlacementTargetLoaded;
}
if (AssociatedObject.PlacementTarget != null)
{
((Control)AssociatedObject.PlacementTarget).Loaded += OnPlacementTargetLoaded;
AttachWindowEvents();
}
_lastPlacementTarget = AssociatedObject.PlacementTarget;
}
private void OnPlacementTargetLoaded(object sender, RoutedEventArgs e)
{
AttachWindowEvents();
}
private void OnWindowClosed(object sender, EventArgs e)
{
DetachWindowEvents();
}
private void AttachWindowEvents()
{
if (_lastWindow != null)
{
DetachWindowEvents();
}
System.Windows.Window window = System.Windows.Window.GetWindow(AssociatedObject.PlacementTarget);
if (window != null)
{
window.Deactivated += OnWindowDeativated;
window.Activated += OnWindowActivated;
window.Closed += OnWindowClosed;
}
_lastWindow = window;
}
private void DetachWindowEvents()
{
if (_lastWindow != null)
{
_lastWindow.Deactivated -= OnWindowDeativated;
_lastWindow.Activated -= OnWindowActivated;
_lastWindow.Closed -= OnWindowClosed;
}
}
private void OnWindowDeativated(object sender, EventArgs e)
{
System.Windows.Window window = System.Windows.Window.GetWindow(AssociatedObject.PlacementTarget);
if (window != null && AssociatedObject.IsOpen)
{
_hidden = true;
AssociatedObject.IsOpen = false;
}
}
private void OnWindowActivated(object sender, EventArgs e)
{
if (_hidden)
{
_hidden = false;
AssociatedObject.IsOpen = true;
}
}
}