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}"
>