Я бы сказал, что самый простой способ сделать то, что вы ищете, это использовать Popup . Класс Popup отображает элемент, который плавает над остальными элементами на экране, но является немодальным и может быть настроен на исчезновение, когда пользователь щелкает по нему, - идеально для вашего немодального диалога. Класс Popup имеет свойства, которые позволяют вам контролировать, где он отображается относительно другого элемента управления (в вашем случае, кнопка, которую вы хотите, чтобы пользователь нажал, чтобы открыть всплывающее окно).
Вот пример для всех XAML:
<Grid>
<ToggleButton HorizontalAlignment="Center" VerticalAlignment="Top"
x:Name="PopButton" Content="Pop"/>
<Popup Placement="Bottom" PlacementTarget="{Binding ElementName=PopButton}" StaysOpen="False"
IsOpen="{Binding ElementName=PopButton, Path=IsChecked, Mode=TwoWay}">
<Rectangle Height="100" Width="200" Fill="Blue"/>
</Popup>
</Grid>
Вы также можете использовать команды или обработчики событий для открытия / закрытия всплывающего окна из кода.
Свойства Placement и PlacementTarget задают, где будет появляться всплывающее окно и какой элемент управления будет отображаться относительно него (существуют другие параметры, которые позволяют отображать его относительно текущей позиции и мыши) Если для параметра StaysOpen установлено значение False, WPF автоматически закроет всплывающее окно, когда пользователь нажимает за его пределами.
По умолчанию у всплывающего окна нет собственного стиля - это просто контейнер для плавающего содержимого - поэтому вам придется стилизовать его так, чтобы он выглядел как окно chrome / toolbar / etc. при необходимости.