Tom*_*ies 9 wpf binding popup togglebutton
我有一个包含Togglebutton和Popup的控件.单击ToggleButton时,将显示弹出窗口.取消选中ToggleButton时,弹出窗口应该关闭.此外,单击远离弹出窗口应该会使其关闭,并导致Togglebutton取消选中.
我通过将Popup的StaysOpen属性设置为false来设置它,并将切换按钮的IsChecked属性设置为与Popup的IsOpen属性双向绑定.
一切都很好,除了一个案例 - 选中按钮并打开弹出窗口,单击按钮不会导致弹出窗口关闭,或者按钮返回未选中状态.
我相信,这一定是因为点击按钮会弹出来弹出的IsOpen属性设置为false的StaysOpen逻辑.反过来,这会将Togglebutton设置为未选中状态.这必须在我点击按钮处理之前发生 - 所以点击会重新检查按钮,即竞争条件.
知道我怎么能得到我想要的行为吗?
Cod*_*ked 10
如果您的假设是正确的,您需要一个自定义的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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可能需要!this.IsOpen
从if语句中删除它.如果您使用MyPopup,它将阻止MouseLeftButtonDown事件到达ToggleButton.
上述两种解决方案都有问题.这是使用事件处理程序而不是绑定的另一种解决方案,但确实避免了svick使用MyPopup解决方案指出的丢失点击问题以及ClickMode = Press的问题.xaml看起来像:
<ToggleButton Name="OptionsButton" Checked="OptionsButton_OnChecked" Unchecked="OptionsButton_OnUnchecked" />
<Popup Name="OptionsPopup" StaysOpen="False" Closed="OptionsPopup_OnClosed"/>
Run Code Online (Sandbox Code Playgroud)
和代码:
void OptionsPopup_OnClosed(object sender, EventArgs e)
{
if (OptionsButton != Mouse.DirectlyOver)
OptionsButton.IsChecked = false;
}
void OptionsButton_OnChecked(object sender, RoutedEventArgs e)
{
OptionsPopup.IsOpen = true;
}
void OptionsButton_OnUnchecked(object sender, RoutedEventArgs e)
{
OptionsPopup.IsOpen = false;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4506 次 |
最近记录: |