2

私が書いているアプリケーションには、アプリケーションの状態に関する情報をユーザーに表示するサイドバーがあります。場合によっては、ユーザーはサイドバーのさまざまな要素にカーソルを合わせて、より具体的な詳細を表示できます。これらの詳細は、Bootstrap のPopoverコントロールの動作を模倣するコントロールを使用してユーザーに表示されます。ウィンドウ全体にまたがる非表示のオーバーレイを使用してこれを実現しCanvas、「ポップオーバー」自体は、Canvas計算さCanvas.LeftれたCanvas.Topプロパティを使用して、これに相対的に配置されます。

これは、私のアプリケーションの現在の XAML を (非常に単純化して) 示したものです。

<Window>
  <Grid x:Name="container">

    <.. a lot of various nested elements ..>

      <StackPanel x:Name="sidepanel">
        .. content of the sidepanel control ..
      </StackPanel>

    </.. a lot of various nested elements ..>

  <Canvas x:Name="overlay">
    .. content of the Popover control ..
  </Canvas>
  </Grid>
</Window>

これはうまく機能しますが、この機能を 1 つのコントロールにリファクタリングしたいと考えています。ただし、どうすればよいかわかりません。カスタムの XAML 定義にオーバーレイがUserControl含まれている場合Canvas、現在アプリケーション内に配置されているのと同じ方法で、コントロールのサイドパネル部分を配置できません。ただし、Canvas適切に動作させるには、ウィンドウ全体にオーバーレイを配置する必要があるため、オーバーレイをサイドパネル内にネストすることはできません。

UserControl論理ツリーの異なる部分に配置できるシングルを定義する方法はありますか? または、この効果を達成するためのより良い方法はありますか?

4

1 に答える 1

1

シングルを論理ツリー内の別の場所に分割することはできませんが、UserControl他のコードを に挿入して、Controlそれが定義する内部コンポーネントの周りに配置することはできます。これは、 によって使用されるモデルですHeaderedContentControl: 2 つのコンテンツ プロパティContentと。これらは、コントロールのテンプレート内のHeader2 つの異なる に注入されます。ContentPresentersしたがって、コントロールの本質的な部分の周りの複数の場所に外部で定義されたコンテンツなどがありますExpanderTabItemの場合UserControl、テンプレートではなくメインの XAML に配置するため、バインディングは少し異なりますが、原則は同じです。

タイプ object の 2 つの Dependency プロパティを定義し、UserControlそれらをバインドContentPresentersして、サンプルに「さまざまなネストされた要素がたくさんある」正確な場所に配置します。次に、を使用すると、タグなどの要素内の要素UserControlの下に必要な他の要素を定義するだけで、コンテンツ内に配置されます。UserControl<MyUserControl.MyContentProperty1>UserControl

于 2013-07-09T21:10:30.513 に答える