ToggleButton控制PopUp窗口控件

时间:2015-05-28 09:01:04

标签: c# wpf xaml checkbox popupwindow

我有一个由ToggleButton控制的PopUp控件。这很好用,但我不喜欢ToggleButton的外观,所以我应用了一个控件模板,使ToggleButton看起来像CheckBox。我希望在PopUp可见时检查CheckBox,并在PopUp窗口消失时取消选中。 <ToggleButton x:Name="LegendToggleButton" HorizontalAlignment="Right" IsChecked="{Binding IsOpen, ElementName=LegendPopup, mode=OneWayToSource}"> <ToggleButton.Template> <ControlTemplate TargetType="ToggleButton"> <CheckBox x:Name="LegendCheckBox" Content="Show Legend" Style="{StaticResource {x:Type CheckBox}}" IsChecked="{Binding IsOpen, ElementName=LegendPopup, Mode=TwoWay}" /> </ControlTemplate> </ToggleButton.Template> </ToggleButton> <Popup x:Name="LegendPopup" PlacementTarget="{Binding ElementName=LegendToggleButton}" Placement="Top" PopupAnimation="Fade" StaysOpen="False"> 。我目前的代码如下,但我没有达到预期的效果。

CheckBox

在单击切换按钮时使窗口显示(div变为选中状态,然后在单击其他控件时取消选中并隐藏弹出窗口,这可以正常工作。但是,如果我显示PopUp通过单击切换按钮,然后再次单击切换按钮(我希望隐藏弹出窗口),弹出窗口暂时关闭然后立即重新出现。

3 个答案:

答案 0 :(得分:0)

为什么您希望ToggleButton看起来像CheckBox而不只是使用Checkbox?以下代码就像魅力一样:

<CheckBox x:Name="CheckBox" Content="Check me to open popup" />
<Popup IsOpen="{Binding ElementName=CheckBox, Path=IsChecked}">
    <Border Background="Silver" Padding="10">
        <TextBlock Text="Hello" />
    </Border>
</Popup>

如果你真的想要使用你的解决方案,你应该在他的评论中提供一个“适当的”模板作为sondergard。我不太确定你是否可以将CheckBox嵌套为ToggleButton的控件模板中的唯一元素。我要做的最少的事情是在TemplateBindingCheckBox.IsChecked属性之间建立ToggleButton.IsChecked,以便它们都同步。这也可能导致奇怪的行为,因为你实际上有两个弹出窗口绑定可以更新其IsOpen属性(一个位于ToggleButton,一个位于CheckBox控制模板)。

答案 1 :(得分:0)

我提出了一个解决方案,与我最初提出的问题略有不同,但以下代码提供了我正在寻找的功能。该方法涉及将CheckBox IsChecked和PopUp IsOpen属性绑定到viewmodel上的相同bool,并在CheckBox失去焦点时将此bool设置为false(隐藏窗口并更新CheckBox已检查属性。)

  • XAML:

                                                                     

    <Popup x:Name="LegendPopup"
           PlacementTarget="{Binding ElementName=LegendToggleButton}"
           Placement="Top"
           PopupAnimation="Fade"
           StaysOpen="False"
           IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
             >
    
  • c#Viewmodel

    private bool _showLegendPopup;
    public bool ShowLegendPopup
    {
        get
        {
            return _showLegendPopup;
        } 
        set
        {
            _showLegendPopup = value;
            OnPropertyChanged();
        }
    }
    
    public ICommand PopupClosingCommand { get; private set; }
    
    private void InitialiseCommands()
    {
        PopupClosingCommand =  new DelegatingCommand(PopupClosing);
    }
    
    private void PopupClosing()
    {
        ShowLegendPopup = false;
    }
    

答案 2 :(得分:0)

IsChecked="{Binding IsOpen, ElementName=LegendPopup, mode=OneWayToSource}"

IsChecked="{Binding IsOpen, ElementName=LegendPopup, Mode=TwoWay}"

如果我纠正这些是罪魁祸首......

它实际上一次改变了IsChecked值两次..