当用户单击WPF弹出窗口时如何关闭它

3
当单击弹出窗口内容时,如何关闭以下弹出窗口?
<Button Name="myButton" Content="Hover to open" />
<Popup PlacementTarget="{Binding ElementName=myButton}" Placement="Bottom">
    <Popup.Resources>
        <DataConversion:BooleanOrConverter x:Key="booleanOrConverter" />
    </Popup.Resources>            
    <Popup.IsOpen>
        <MultiBinding Mode="OneWay" Converter="{StaticResource booleanOrConverter}">
            <Binding Mode="OneWay" ElementName="myButton" Path="IsMouseOver"/>
            <Binding RelativeSource="{RelativeSource Self}" Path="IsMouseOver" />
        </MultiBinding>
    </Popup.IsOpen>
    <!-- some content here -->
</Popup>

我希望避免在代码后台文件中编写代码,并将可视和行为事物如IsOpen属性或MouseDown事件绑定到ViewModel中。

2
Code-behind最近受到了很多不应得的声名狼藉。它并不是一种旨在混淆代码的邪恶力量。对我来说,关键的区别在于由code-behind实现的交互是否是ViewModel逻辑的实际行为的一部分,还是仅仅是用于通信交互的粘合剂。在后一种情况下,拥有一些粘合代码通常比为了松耦合而拥有一个复杂的结构要更加简洁。 - Dan Bryant
关闭窗口是UI的工作,而不是ViewModel的工作。VM = 业务逻辑。UI = UI逻辑。 - user1228
2个回答

2
您的Popup需要一个EventTrigger触发一个包含BooleanAnimationUsingKeyFrames的故事板,将IsOpen设置为false类似于此示例。更容易的方法是使用代码后台 ;o)

2
您可以将Popup.Child设置为一个Button(将其样式设置为不像按钮),处理其Click事件,并将IsOpen设置为false(最好使用SetCurrentValue以不破坏绑定)。您可以在后台代码中或使用行为/触发器操作来完成此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接