2011-09-29 77 views
8

WPF真的让我摆脱我的神经在这里。我配置了一些带有一些复杂内容(网格,按钮等)的弹出窗口。在文本框MouseDown预览事件中,我将其StableOpen属性设置为False,将IsOpen设置为True。弹出窗口永不关闭

THS的是,它打开,但从来没有单击窗口外的任何地方时关闭。

有什么建议吗?

谢谢!

UPDATE:

我弹出了里面的按钮。当我点击其中一个时,弹出窗口会在我点击它之外时关闭。事件路由发生了一些奇怪的事情吗?

+0

你试过手动关闭它像你有任何关闭按钮吗?或将ESC键等键映射到弹出窗口。 –

+0

我可以这样做,但我需要它失去焦点时自动关闭。 –

+0

你可以添加简单的XAML来证明这个问题(也可以帮助你调试)? –

回答

4

看起来像弹出窗口将不会关闭,如果由任何其他控件事件打开。我只是将IsOpen属性绑定到ToggleButton的IsChecked属性来模拟组合框。

感谢您的答案。

+0

我同意,同样的事情为我工作。奇怪的行为,但工作。在代码中为IsOpenProperty创建了一个绑定到一个切换按钮IsChecked属性,它工作正常。我要买它 :) – TravisWhidden

0

我在文本框的MouseDown预览事件上设置了IsOpen。

它设置的是什么? TextBox托管在哪里?

我只能猜测提供的信息很少,但我会说当你点击Popup以外的地方时,你的事件处理程序正在触发并再次打开它。

+0

该文本框位于窗口中使用的用户控件中。在用户控件中,无论何时单击文本框,我都会设置IsOpen = true。当弹出窗口失去焦点时,它永远不会关闭。 –

0

您可以使用LostFocus事件弹出窗口。如果焦点不在弹出框内,请将它的IsOpen设置为false以关闭它。

+0

它什么也没做。如果我将弹出的IsOpen属性设置为true来启动窗口,它将正常工作。如果我在文本框PreviewMouseButtonDown事件上设置它不起作用。 –

0

我也有这个问题,除了在按钮的PreviewMouseButtonUp事件。假设Popups存在一些错误并试图在Tunneling事件中打开它们,这是非常准确的,并且让我走上了修补程序的路径(这更通用一些)。

我需要通过侦听冒泡事件而不是隧道事件来解决这个问题(主机控件是通用的/可能是几种类型的控件),特别是使用AddHandler(RoutedEvent,Delegate,Boolean)方法来捕获处理的事件。从隧道过渡到起泡时

WAG问题在于某处。

0

我用后面的代码初始化弹出,我发现,如果从如鼠标事件的其他UI动作跑同步没有关闭。要解决此问题,我运行它异步:

public static void ShowPopupMessage(string message) 
    { 
     DispatcherHelper.UIDispatcher.BeginInvoke(new Action(() => 
     { 
      var popup = new Popup 
      { 
       Child = new AutoHideMessage(message), 
       StaysOpen = false, 
       IsOpen = true 
      }; 
     })); 
    }