Как сделать usercontrol на самом верху в wpf?

У меня есть сетка, которая содержит три строки. Первый ряд содержит те, которые показывают панель инструментов. Вторая строка содержит строку состояния. Третья строка содержит список, который является данными, привязанными к наблюдаемой коллекции.

При выполнении некоторых условий мне нужно показать всплывающее окно.

Я думал использовать popup, проблема с popup заключается в том, что при перемещении окна он не будет перемещаться с родительским элементом управления.

Поэтому я решил создать пользовательский элемент управления (скажем, mypopup), который программно добавляется во вторую строку с более высоким ZIndex, проблема в том, что даже если я установлю более высокий индекс, он будет следовать за ListboxItems.

а) Любое решение для этого?

В качестве решения, которое я решил использовать Adorner для этого пользовательского элемента управления (mypopup), проблема заключается в том, что мой пользовательский элемент управления (mypopup) содержит кнопки и флажки, после применения adorner эти элементы управления не доступны.

б) Любая идея, чтобы сделать мой пользовательский элемент управления интерактивным с Adorner?

2 ответа

Решение
<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>

Не устанавливайте ширину в пользовательском контроле, поскольку она должна растягиваться, используйте d:DesignWidth/Height, если вам нужно. Порядок имеет значение, последний находится над другими в том же ряду. Измените row и rowspan, если вы хотите, чтобы он занимал только 3-й ряд.

Украшатели не дадут вам интерактивность. Они просто основаны на рисовании. Таким образом, они не будут реагировать, как пользовательский элемент управления, если вы не "имитируете" его. Так что давайте пока держим их в стороне.

Используйте только всплывающие окна. Установите их цель размещения и ориентацию размещения. Всплывающее окно расположено в верхнем левом углу кнопки.

        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; 

Позвольте мне знать, если это помогает.

Другие вопросы по тегам