1

私は C# WPF アプリケーションを構築しており、XAML ビューの 1 つで、線を使用して異なるコンテナーに存在する 2 つのコントロールを接続する必要があります。

これが私の簡略化されたレイアウトの擬似コードです。

<DockPanel>
   <Grid DockPanel.Dock="Top">
      <Button Name="Button1" />
   </Grid>
   <UniformGrid Columns="3" DockPanel.Dock="Bottom">
      <StackPanel>
         <Button Name="ButtonA" />
      </StackPanel>
      <StackPanel>
         <Button Name="ButtonB" />
      </StackPanel>
      <StackPanel>
         <Button Name="ButtonC" />
      </StackPanel>
   </UniformGrid>
</DockPanel>

私の要件は、Button1 を ButtonA、B、または C に Line で接続することですが、方法がわかりません。私が調査したことから、通常、人々はキャンバスを使用し、そのキャンバスでホストされているコントロールを接続し、添付されたプロパティ Canvas.SetTop および Canvas.SetLeft を使用してコントロールをコンテナ内に配置します。DockPanel を Canvas でラップしようとしましたが、うまくいきませんでした。

私の質問は次のとおりです。異なるタイプのレイアウト間でコントロールを接続する線を引くことは可能ですか? (私の場合、DockPanel-Grid-UniformGrid)またはこれを達成するための代替またはより標準的な方法は何ですか。また、DockPanel に対するコントロールの位置を取得しようとしましたが、うまくいきませんでした...

前もって感謝します

4

1 に答える 1

0

Charles Petzoldの記事「Thinking outside the grid」に基づいて、次のような構造になりました。

<UserControl ... >
  <Grid ... >
    <local:SimpleUniformGrid ... >
      <Button ... />
      <Button ... />
      ...
    </local:SimpleUniformGrid>

    <Canvas>
      <Path ... /> 
      <Path ... />
      <Path ... />
    </Canvas>
  </Grid>
</UserControl>

重要な段落は次のとおりです。

「LayoutUpdated イベントを処理するとき、別のレイアウト パスを引き起こし、無限再帰に巻き込まれるようなことはしたくありません。そこで Canvas が役に立ちます。それは常に親にゼロのサイズを報告するため、あなたはレイアウトに影響を与えずにキャンバス内の要素を変更できます。」

それに加えて、Dragable Objects 記事の Denis Vuyka MyThumb クラスを使用しました。

この記事で説明されているように、線を作成するときの開始点と終了点は、GeneralTransform クラスを使用して決定できます。

    GeneralTransform transform = thumb.TransformToAncestor(this);
    Point rootPoint = transform.Transform(new Point(0, 0));

ここでの重要な教訓は、Canvas が Grid 内のスペースを占有しないことを理解することでした。そのため、パス/LineGeometry を格納するためのコンテナーとしてキャンバスを使用し、ソース/ターゲット コントロールが属しているかどうかに関係なく、ビュー内の任意の座標に表示できます。異なるコンテナに。

于 2013-01-31T19:05:31.397 に答える