2013-01-14 43 views
3

我花了数小时才弄清楚这个问题的答案,所以我想我会写一个常见问题解答或回答我发现的问题。 (它是基于以下线程Binding Textbox IsFocused to Popup IsOpen plus additional conditionsWPF如何将Popup附加到简单的UIElement,如矩形

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

所以我发布这个问题,我会立即发布我找到的答案,以便希望其他人可以从中受益。我也会为任何能够帮助我理解stackoverflow是否允许这样的帖子的人提供答案,或者我可以更好地解决这个问题。

EDIT 1)

我不能为8小时,以便在这里自我的答案是工作代码: 下面是如何使用弹出一个基本的UIElement类似矩形一个简单的例子/椭圆形的/ etc ...

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

只需粘贴这里面的窗口/用户控件的/ etc ...

回答

2

我建议以下改进。它将使Popup Style独立于任何元素名称,并因此使您能够将其作为默认样式,方法是将其放入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> 

并请注意,Rectangle不是 “基本的UIElement”。这是一个Shape,它本身是一个FrameworkElement

+0

太棒了,我完全忽略了那个相对的约束。它允许我将所有样式移动到资源字典中并清理我的xaml。此外,谢谢你在frameworkelement的清晰度。这是我的第一个WPF项目,我有很多东西需要学习。 –