【问题标题】:How to keep pop up open until it has focus in wpf如何保持弹出窗口打开,直到它在 wpf 中获得焦点
【发布时间】:2013-09-11 17:23:26
【问题描述】:

我有以下 XAML 用于在文本框的鼠标输入事件上显示弹出窗口并在文本框的鼠标离开事件时关闭弹出窗口。因此,当我尝试转到弹出窗口时,会调用鼠标离开事件并关闭弹出窗口。因此,如果我专注于弹出窗口,则不应关闭我想要的弹出窗口,而如果我单击了弹出窗口或鼠标未弹出,则应关闭弹出窗口。

注意:但是如果我没有专注于弹出窗口,则应该在鼠标离开时关闭弹出窗口。

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Control VerticalAlignment="Top">
            <Control.Template>
                <ControlTemplate>
                    <StackPanel>
                        <TextBox x:Name="MyText"></TextBox>
                        <Popup x:Name="Popup" PopupAnimation="Fade" VerticalAlignment="Top">
                            <Border Background="Red">
                                <TextBlock>Test Popup Content</TextBlock>
                            </Border>
                        </Popup>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="UIElement.MouseEnter" SourceName="MyText">
                            <BeginStoryboard>
                                <Storyboard>
                                    <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)">
                                        <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True"/>
                                    </BooleanAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="UIElement.MouseLeave" SourceName="MyText">
                            <BeginStoryboard>
                                <Storyboard>
                                    <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)">
                                        <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/>
                                    </BooleanAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Control.Template>
        </Control>
    </Grid>
</Window>

【问题讨论】:

  • 请不要全部使用粗体字。

标签: wpf xaml popup controltemplate eventtrigger


【解决方案1】:

您必须为弹出窗口添加 mouseenter 和 mouseleave 事件,也与文本框相同

                  <EventTrigger RoutedEvent="UIElement.MouseEnter" SourceName="Popup">
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)">
                                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>

                    <EventTrigger RoutedEvent="UIElement.MouseLeave" SourceName="Popup">
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)">
                                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>

【讨论】:

    【解决方案2】:

    我这样做的方法是将bool 值绑定到Popup.IsOpen 属性。您仍然可以在 MouseEnter 处理程序中将此设置为 true,但您可以选择何时将其设置为 false:

    <Popup IsOpen="{Binding IsPopupOpen}" StaysOpen="False" AllowsTransparency="True">
    

    【讨论】:

    • 感谢您的回答,但实际上我不想使用 ViewModel 的属性,而是想通过 XAML 本身来完成所有的魔法
    猜你喜欢
    • 2013-11-23
    • 2018-03-18
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多