我有一个包含切换按钮和弹出窗口的控件。单击 ToggleButton 时,会出现弹出窗口。当 ToggleButton 未选中时,弹出窗口应关闭。此外,单击远离弹出窗口应导致其关闭,并导致切换按钮取消选中。
我通过将 Popup 的 StaysOpen 属性设置为 false,并将切换按钮的 IsChecked 属性设置为双向绑定到 Popup 的 IsOpen 属性来进行设置。
一切都很好,除了一种情况 - 选中按钮并打开弹出窗口后,单击按钮不会导致弹出窗口关闭,或者按钮返回到未选中状态。
我相信这一定是因为单击按钮会导致 Popup 的 StaysOpen 逻辑将 Popup 的 IsOpen 属性设置为 false。反过来,这会将切换按钮设置为未选中。这必须在处理我点击按钮之前发生 - 因此点击会重新检查按钮,即竞争条件。
知道如何获得我想要的行为吗?
如果您的假设是正确的,您需要一个自定义 Popup 类,如下所示:
public class MyPopup : Popup {
protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) {
bool isOpen = this.IsOpen;
base.OnPreviewMouseLeftButtonDown(e);
if (isOpen && !this.IsOpen)
e.Handled = true;
}
}
您可能需要删除!this.IsOpen
来自 if 语句。如果您改用 MyPopup,它将阻止 MouseLeftButtonDown 事件到达 ToggleButton。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)