我有一个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}}"
答案 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>