2017-04-11 29 views
1

メインウィンドウとして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> 

メインウィンドウ要素名は私のメインウィンドウの一つであります

<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

" MainWindow "型がWPFで認識されないため動作しませんでした。しかし、 "ウィンドウ"では、それは動作します:PlacementTarget = "{バインディングRelativeSource = {RelativeSource AncestorType =ウィンドウ}}"。ありがとう! – Cleo

答えて

2

を使用することでした。この1つは動作するはずです:あなたは{RelativeSource AncestorType =ウィンドウを使用している場合

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

このような方法であなたが別のコントロール/ユーザーコントロールでユーザーコントロールを使用することができますし、それを変更する必要はありません、ただ、外からTagプロパティを設定します}あなたはそれを変更する必要があります。

+0

Nopeは動作しません。実行時に「System.Windows.Markup.XamlParseException」をスローします(「参照は解決できませんでした」)。 "mainWindow"は別のファイル(または名前空間?)で宣言されているからだと思います。 – Cleo

+0

MainWindowのPopUpと思っています。私は自分の答えを編集しました。 – Rekshino

関連する問題