C# 控制弹出窗口控件的切换按钮

C# 控制弹出窗口控件的切换按钮,c#,wpf,xaml,checkbox,popupwindow,C#,Wpf,Xaml,Checkbox,Popupwindow,我有一个由切换按钮控制的弹出控件。这很好,但是我不喜欢ToggleButton的外观,因此我应用了一个控件模板,使ToggleButton看起来像一个复选框。我希望在弹出窗口可见时选中复选框,在弹出窗口消失时取消选中该复选框。我目前的代码如下,但我没有得到想要的效果 <ToggleButton x:Name="LegendToggleButton" HorizontalAlignment="Right" IsChecked="{Binding I

我有一个由
切换按钮控制的弹出控件。这很好,但是我不喜欢
ToggleButton
的外观,因此我应用了一个控件模板,使
ToggleButton
看起来像一个
复选框。我希望在弹出窗口可见时选中
复选框
,在弹出窗口消失时取消选中该复选框。我目前的代码如下,但我没有得到想要的效果

    <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">
<Popup x:Name="LegendPopup"
       PlacementTarget="{Binding ElementName=LegendToggleButton}"
       Placement="Top"
       PopupAnimation="Fade"
       StaysOpen="False"
       IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
         >


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

为什么您希望
切换按钮
看起来像一个
复选框
,而不是仅仅使用
复选框
?以下代码就像一个符咒:

<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>
<Popup x:Name="LegendPopup"
       PlacementTarget="{Binding ElementName=LegendToggleButton}"
       Placement="Top"
       PopupAnimation="Fade"
       StaysOpen="False"
       IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
         >


如果你真的想使用你的解决方案,你应该提供一个“适当的”正如sondergard在他的评论中所建议的模板。我不太确定是否可以只嵌套一个
复选框
,作为
切换按钮
的控件模板中的唯一元素。我至少要做的是在
复选框.IsChecked
切换按钮.IsChecked
之间建立
模板绑定属性,使两者同步。这也可能是导致异常行为的原因,因为您实际上有两个到弹出窗口的绑定,可以更新其
IsOpen
属性(一个在
切换按钮上,一个在控件模板中的
复选框上).

我想出了一个解决方案,与我最初提出的问题略有不同,但以下代码提供了我想要的功能。该方法包括将
复选框
和弹出的
IsOpen
属性绑定到viewmodel上的同一个bool,并设置此bo当
复选框
失去焦点时,ol变为false(隐藏窗口并更新
复选框
选中属性)

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

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

    <Popup x:Name="LegendPopup"
           PlacementTarget="{Binding ElementName=LegendToggleButton}"
           Placement="Top"
           PopupAnimation="Fade"
           StaysOpen="False"
           IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
             >
    
如果我是对的,他们就是罪魁祸首

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

实际上,它一次更改了两次IsChecked值。

在不知道您实际看到了什么以及您希望看到什么的情况下,我会大胆猜测:无论何时更改控件模板,都需要从头开始。更改控件外观的最佳方法是复制/粘贴样式和t从MSDN部署,并更改您需要的内容:我最初尝试过这一点,尽管我相信如果您将弹出窗口的staysOpen属性设置为false,那么当弹出窗口未实际打开时,复选框将保持选中状态,我正试图消除这种行为。
<Popup x:Name="LegendPopup"
       PlacementTarget="{Binding ElementName=LegendToggleButton}"
       Placement="Top"
       PopupAnimation="Fade"
       StaysOpen="False"
       IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
         >