WPF组合框就像弹出窗口一样

时间:2017-01-24 20:54:45

标签: c# wpf

我正在尝试制作一个类似于组合框的自定义弹出窗口。

我使用了一个Toggle按钮作为标题,并使用了Popup作为内容。

<ToggleButton IsChecked="{Binding ElementName=Popup, Path=IsOpen, Mode=TwoWay}">
...
</ToggleButton>

<Popup x:Name="Popup" StaysOpen="False">
...
</Popup>

除了一个案例外,这个工作很好。当弹出窗口打开并再次单击ToggleButton时,弹出窗口消失,但随后重新打开。

当我点击切换按钮时,Popup检测到鼠标单击位于弹出窗口之外,因此它自行关闭并设置ToggleButton.IsChecked = false。然后点击设置IsChecked = true,以便弹出窗口再次打开。

编辑:在这种情况下,我希望弹出窗口能够像Combobox的行为一样关闭。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:3)

两种方式。

一种是在按钮顶部找到弹出窗口,这样用户就无法点击按钮。我不喜欢那个,但您可以使用Placement等轻松完成。

另一种是将ToggleButton.IsEnabled绑定到Popup.IsOpen,使用布尔值&#34;不是&#34;转换器,因此只要弹出窗口打开,该按钮就会被禁用。

您也可以使用按钮上的样式DataTrigger执行此操作,如下所示:

<ToggleButton 
    x:Name="PopupButton"
    Content="Open Popup"
    IsChecked="{Binding ElementName=Popup, Path=IsOpen}">
    <ToggleButton.Style>
        <Style TargetType="ToggleButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsOpen, ElementName=Popup}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

<Popup 
    x:Name="Popup" 
    StaysOpen="False"
    PlacementTarget="{Binding ElementName=PopupButton}" 
    Placement="Bottom"
    >
    <Label 
        Padding="20" 
        Background="WhiteSmoke" 
        BorderBrush="Black" 
        BorderThickness="1">Content</Label>
</Popup>

请注意,Mode=TwoWay绑定不需要IsChecked。这是该属性的默认值。

如果您有多个这样的内容,我会为Style写一个HeaderedContentControl ControlTemplate,并将标题放入{{1}内容,ToggleButton中的内容,Popup启用ToggleButton触发器。