如何让用户控制在wpf的最顶层?

时间:2011-09-24 19:14:09

标签: wpf popup adorner

我有一个包含三行的网格。 第一行包含哪个显示工具栏。 第二行包含显示状态栏的内容。 第三行包含Listbox,它是绑定到observable集合的数据。

当满足某些条件时,我需要显示弹出窗口。

我想使用弹出窗口,弹出窗口的问题是当我移动窗口时它不会随父控件一起移动。

所以我决定创建一个用户控件(比如mypopup),它以第二行的方式添加ZIndex,编程方式更高,问题是即使我设置了更高的索引,它也会落后于ListboxItems。

a)对此有何解决方案?

作为一个解决方案,我认为使用Adorner进行该用户控件(mypopup),问题是我的用户控件(mypopup)包含Button和Checkbox,在应用adorner后,这些控件无法访问。

b)是否有任何想法让我的用户控件与装饰者互动?

2 个答案:

答案 0 :(得分:1)

装饰者不会给你互动。它们只是基于绘图。所以他们不会像用户控件那样做出反应,除非你“模拟”它。所以暂时把它们放在一边。

仅使用弹出式窗口。设置展示位置和展示位置。下面的弹出窗口位于Button的左上角。

        popup.PlacementTarget = MyButton;
        popup.Placement = PlacementMode.Relative;

它沿放置目标移动,即MyButton。为此我改变了按钮的边距,因此弹出移动。要进行此效果,您需要隐藏弹出窗口并重置其放置目标。

        popup.IsOpen = false;
        popup.PlacementTarget = null;
        MyButtonMargin = new Thickness(MyButton.Margin.Left + 10);
        popup.PlacementTarget = MyButton;
        popup.IsOpen = true; 

如果有帮助,请告诉我。

答案 1 :(得分:0)

<Window...>
<Grid>
   <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
   </Grid.RowDefinitions>

   <Toolbar Grid.Row="0" ... />
   <Statusbar Grid.Row="1" ... />
   <ListBox Grid.Row="2" ... />

   <OverlayControl Grid.Row="0" Grid.RowSpan="3" 
                   HorizontalAlignment="Stretch" 
                   VerticalAlignment="Stretch" />
</Grid>
</Window>

OverlayControl:

<UserControl ...>
<Grid Background="#30000000">
   <Border HorizontalAlignment="Center" VerticalAlignment="Center" ...>
        Content, e.g. TextBlock with a message 
   </Border>
</Grid>
</UserControl>

不要在usercontrol上设置宽度,因为它应该伸展,如果需要,请使用d:DesignWidth / Height。订单很重要,最后一个是在同一行内的其他订单。如果您只想占用第3行,请更改行和行数。