3

我花了几个小时才弄清楚这个问题的答案,所以我想我会写一个常见问题解答或回答我发现的问题。(它是基于以下线程Binding Textbox IsFocused to Popup IsOpen 加上附加条件

我发现了很多将弹出窗口绑定到切换按钮和其他基于 windows chrome 并具有内置触发器的示例的示例。但在我的应用程序中,我想将一个弹出窗口绑定到一个带有自定义画笔填充的简单矩形。当用户将鼠标悬停在矩形上时,我找不到有关如何打开弹出窗口并保持打开状态的示例。

所以我发布了这个问题,我会立即发布我找到的答案,希望其他人可以从中受益。我还将为任何可以帮助我了解 stackoverflow 是否允许这样的帖子,或者我本可以解决的更好方法的人标记一个答案。

编辑 1)

我无法在 8 小时内自行回答,所以这是工作代码:以下是如何在基本 UIElement(如矩形/椭圆/等)上使用弹出窗口的简单示例...

<Grid HorizontalAlignment="Stretch" Height="Auto">
    <Rectangle x:Name="PopupRec"
               Grid.Row="0"
               Width="20" Height="20"
               HorizontalAlignment="Right" 
               Fill="Gray" Margin="0,0,0,10" />
    <Popup x:Name="SortPopup" 
           PlacementTarget="{Binding ElementName=PopupRec}" 
           StaysOpen="False" 
           PopupAnimation="Slide" 
           AllowsTransparency="True">
        <Border Background="White" Padding="15">
            <StackPanel Orientation="Vertical">
                <Button Command="{Binding MyCommand}" CommandParameter="5">5</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="10">10</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="15">15</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="20">20</Button>
            </StackPanel>
        </Border>
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=PopupRec, Path=IsMouseOver}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=SortPopup, Path=IsMouseOver}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>
    </Popup>
</Grid>

只需将其粘贴到窗口/用户控件/等...

4

1 回答 1

3

我建议进行以下改进。它将使弹出式样式独立于任何元素名称,从而使您能够通过将其放入 Window 或 UserControl 中将其用作默认样式Resources

<Style TargetType="{x:Type Popup}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsMouseOver,
                               RelativeSource={RelativeSource Self}}"
                     Value="True">
            <Setter Property="IsOpen" Value="True" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=PlacementTarget.IsMouseOver,
                               RelativeSource={RelativeSource Self}}"
                     Value="True">
            <Setter Property="IsOpen" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

请注意 aRectangle不是“基本 UIElement”。它是一个Shape,它本身就是一个FrameworkElement

于 2013-01-15T09:01:52.553 回答