1

いくつかのデータを表すグリッドがあり、その上にオーバーレイしていくつかの行をレイアウトするキャンバスが必要です。キャンバスは独自のユーザーコントロール内にあります

問題は、グリッドの幅と高さのサイズが変更されると、キャンバスとその内容が自動的にサイズ変更されることです。

ビューボックス内にキャンバスを追加しましたが、うまくいきませんでした。グリッドのサイズが変更されても、キャンバスは変更されません。キャンバスの目的は、定規のような機能をグリッドの上に重ねることです。

グリッドにはキャンバスとは異なる情報が表示されるため、グリッドのスタイルを使用してキャンバスを置き換えることはできません。さまざまなサイズのバー列 (私の場合はグリッド) があり、日がオーバーレイの線 (ガント チャートと同様) であるチャートと考えてください。

私のコード:

taxCanvas = new TimeAxis();
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count);
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count);
Grid.SetColumn(taxCanvas, 0);    Grid.SetRow(taxCanvas, 0); 
Grid.SetZIndex(taxCanvas, -1);
taxCanvas.Height = GRight.ActualHeight;
taxCanvas.Width = GRight.ActualWidth;
GRightMain.Children.Add(taxCanvas);

TimeAxis は私のキャンバス ユーザー コントロールです。GRightMain は、私のキャンバスとコンテンツ (Gright) を持つグリッドの両方を同じ行と列に保持するグリッドです。

4

2 に答える 2

1

問題の直接の原因は次の行です。

taxCanvas.Height = GRight.ActualHeight;
taxCanvas.Width = GRight.ActualWidth;

これにより、TimeAxis コントロールの固定サイズが設定され、自動サイズ変更が無効になります。

TimeAxis ユーザー コントロールにメジャーに影響する内部設定がないと仮定すると、Height と Width の設定を次のように置き換えると、UserControl のサイズが自動的に変更されます。

taxCanvas.HorizontalAlignment = HorizontalAlignment.Stretch;
taxCanvas.VerticalAlignment = VerticalAlignment.Stretch;

ただし、これで問題が完全に解決されるとは限りません。UserControl の目的のサイズとレイアウト サイズはグリッドのサイズと同じになりますが、キャンバス上のオブジェクトのサイズを手動で変更する必要があります。キャンバスには測定/配置の規定がないため、コードでこれを処理する必要があります。一般的な手法は次のとおりです。

  1. 既に試した ViewBox 内で Canvas をラップします。上記の行を変更して、これを再試行してください。
  2. コードまたはバインディングを使用してキャンバスの RenderTransform を調整します (LayoutTransform を調整するよりも効率的で、キャンバスはレイアウトに関与しません)。
  3. コードまたはバインディングを使用して個々の形状の位置を調整する

注意すべき 1 つの問題: キャンバスのサイズを変更しても、その内容は影響を受けません。したがって、キャンバスが実際にサイズ変更されているかどうかを知りたい場合は、背景色を指定してください。そうすれば、サイズの問題で間違った場所を探して時間を無駄にすることはありません。

于 2009-11-02T16:51:35.997 に答える
0

GRightMail コントロールはグリッドであり、デフォルトでコンテンツを拡大します。データと TimeAxis コントロールの両方が同じグリッド セル (および同じ行/列スパン) にある場合、それらは一緒にストレッチする必要があります。

それでも問題が解決しない場合は、TimeAxis の幅や高さが固定されていないこと、または Horizo​​ntal/VerticalAlignment が定義されていないことを確認してください。

于 2009-11-02T14:48:04.657 に答える