相对于主窗口的WPF Popup放置

时间:2017-04-11 14:09:57

标签: wpf xaml popup placement

我有一个WPF应用程序,它使用一个窗口作为主窗口。现在我想在窗口中显示各种弹出窗口。当弹出窗口放在窗口内时,这很好用。但是,我已经将弹出窗口实现为用户控件;意思是主窗口包含一个用户控件,它本身包含实际的弹出窗口。所以UI元素树看起来像这样:

Window --> UserControlPopup --> Popup

用户控件中的弹出窗口声明如下:

<UserControl x:Class="X.Custom_Controls.ErrorPopup"
         ...
         xmlns:local="clr-namespace:X.Custom_Controls"
         mc:Ignorable="d" d:DesignHeight="360" d:DesignWidth="500">

<Popup Name="errorPopup" Height="360" Width="500" Placement="Center" StaysOpen="True" PlacementTarget="{Binding ElementName=mainWindow}">
    ...
</Popup> </UserControl>

mainWindow 元素名称是我的主窗口之一,声明如下:

<Window x:Class="X.MainWindow" x:Name="mainWindow" ...>

问题是弹出窗口不是放在中间,而是放在左侧。所以我的猜测是弹出窗口无法正确解析elementName(因为它是mainWindow子节点的子节点)。有谁知道如何在XAML中解决这个问题?

更新:解决方案是使用

PlacementTarget="{Binding RelativeSource={RelativeSource AncestorType=Window}}"

1 个答案:

答案 0 :(得分:3)

尝试通过x:Reference访问您的主窗口。这应该工作:

<MainWindow x:Name="mainWindow">
    <UserControl Tag="{x:Reference mainWindow}">
</MainWindow>
<UserControl x:Name="userControl">
<PopUp PlacementTarget="{Binding Path=Tag, ElementName=userControl}"/>
</UserControl>

这种方式你可以在另一个Controls / UserControls中使用你的UserControl,你不需要修改它,只需从外面设置Tag属性,如果你使用{RelativeSource AncestorType = Window}你将需要修改它。 / p>