2017-04-11 11 views
1

하나의 창을 주 창으로 사용하는 WPF 응용 프로그램이 있습니다. 이제 창 중앙에 다양한 팝업을 표시하려고합니다. 이 팝업 창이 창 내부에 배치되면 잘 작동합니다. 그러나 사용자 컨트롤로 팝업을 구현했습니다. 주 윈도우에 실제 팝업이 포함 된 사용자 컨트롤이 있다는 것을 의미합니다. 그래서 UI 요소 트리는 다음과 같습니다WPF 주 창에 상대적인 팝업 배치

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" ...> 

문제는 팝업이 가운데에 배치되지 않지만 왼쪽에 배치된다는 것입니다. 그래서 내 생각 엔 popup이 elementName을 올바르게 해석 할 수 없다는 것입니다 (mainWindow의 하위 요소이므로). 누구든지 XAML에서이 문제를 해결할 수있는 방법을 알고 있습니까?

업데이트 : 솔루션은 x:Reference을 통해 메인 창을 액세서하는

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

상대 소스를 사용해 보셨습니까? 'PlacementTarget = "{RelativeSource AncestorType = MainWindow}}" – ASh

+0

WPF에서 형식을 인식하지 못하기 때문에 "MainWindow"가 작동하지 않았습니다. 그러나 "창"을 사용하면 작동합니다. PlacementTarget = "{Binding RelativeSource = {RelativeSource AncestorType = Window}}". 감사! – Cleo

답변

2

시도를 사용하는 것이 었습니다. 이것은 작동합니다 : 당신이 {RelativeSource AncestorType = 창을 사용하는 경우

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

이러한 방법으로 다른 컨트롤/추가 된 UserControls에 UserControl을 사용할 수 있습니다 당신이 그것을 수정할 필요가 없습니다 것입니다, 다만, 외부에서 태그의 속성을 설정 } 당신이 그것을 수정해야합니다.

+0

Nope가 작동하지 않고 런타임에 "System.Windows.Markup.XamlParseException"을 throw합니다 ("참조를 확인할 수 없음"). 나는 "mainWindow"가 다른 파일 (또는 네임 스페이스)에 선언 되었기 때문이라고 생각합니다. – Cleo

+0

MainWindow의 PopUp이 생각났습니다. 내 대답을 편집했습니다. – Rekshino