我试图做一些从用户界面层面看起来相对简单和逻辑的事情,但是我有一个非常烦人的bug。我有一个ToggleButton
,我试图在按钮切换时显示Popup
,在按钮切换时隐藏Popup
。当用户点击离开它时,Popup
也会隐藏起来。
对于以下XAML,一切都按预期工作,除了当我在显示Popup
后单击切换按钮时,Popup
消失了一瞬间,然后重新出现。
我怀疑这里发生的事情是,点击远离Popup
导致它切换按钮关闭,然后立即在按钮切换回鼠标点击它。我只是不知道如何去修复它。
任何帮助都是感激不尽的。谢谢。
<ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" />
<Popup StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}">
<Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black">
<TextBlock>This is a test</TextBlock>
</Border>
</Popup>
5条答案
按热度按时间2ekbmq321#
Stephans的回答有一个缺点,即当弹出窗口失去焦点时关闭弹出窗口的预期行为也会消失。
我通过在弹出窗口打开时禁用切换按钮来解决这个问题。另一种方法是使用IsHitTestVisible属性来代替启用:
转换器如下所示:
lyr7nygr2#
没有IValueConverter的解决方案:
oknwwptz3#
我也遇到了同样的问题。这里提供的答案都不正确。
经过一点研究,我可以说问题作者的怀疑是正确的。在鼠标单击过程中,第一次单击(向下)关闭弹出窗口并将togglebutton设置为未选中,第二次单击(向上)在弹出窗口再次出现时导致观察到的操作。
避免此问题的第一种方法是通过延迟放弃第二次单击:
它看起来很简单,足以解决问题。虽然它不是一个理想的解决方案。最好的方法是通过行为扩展弹出窗口的功能:
添加这些命名空间
然后通过 i:Interaction.Behaviors 扩展弹出窗口
最后添加行为。最小形式的行为可能如下所示:
7xzttuei4#
在切换按钮上设置属性
ClickMode="Press"
apixeltoofarbxjv4tth5#
为您的
Popup
设置StaysOpen="True"
从MSDN开始:
获取或设置一个值,该值指示当Popup控件不再处于焦点时是否关闭该控件。
[...]
true
,如果Popup
控件在IsOpen
属性设置为false
时关闭;false
,如果Popup
控件在Popup
控件外部发生鼠标或键盘事件时关闭。