1

次の形式で項目を表示する Panel または ItemsControl を作成しようとしています。

ヘッダー 1

  • サブアイテム 1
  • サブアイテム 2
  • サブアイテム 3

ヘッダー 2

  • サブアイテム 1
  • サブアイテム 2

これは簡単ですが、ここでの問題は、アイテムをページ形式で分割できるようにする必要があることです。コントロールの高さに基づいて、収まらないものは次のページに配置されます (など)。サブアイテム間で分割が発生した場合は、次のページにも対応するヘッダーを再表示する必要があります。

MeasureOverride と ArrangeOverride を使用して作業を進めましたが、行き止まりに陥り続けています。これは計算上は些細なことですが、WPF/Silverlight で達成するのは悪夢であるため、非常にイライラします。レポート パッケージを使用したことがある場合、概念はこれと非常によく似ています。

(Dispatcher.BeginInvoke を使用して) コントロールに子を追加するまで、高さを決定できないという事実に何度も戻ってきます。

これを達成するための提案はありますか?前もって感謝します!


編集

[WPF] ObservableCollection および ListBoxItem DataTemplate 生成の問題

この上記のリンクは、mdm20 が提案したものと非常に似ていますが、まだ行き詰まっています。ActualHeight を取得しようとするたびに、0 が返されます。また、Dispatcher.BeginInvoke 操作で呼び出しをラップしない限り、Silverlight 3 の ItemContainerGenerator はコンテナーに対して null を返します。

4

2 に答える 2

0

これを実装しなければならないとしたら、パネルでやろうとは思わない。アイテムのコレクション、ヘッダー テンプレート、ページング テンプレート、およびアイテム テンプレートが必要になると思います。次のようなものを使用して、テンプレートの高さを取得できます。

    Size maxSize = new Size(0, 30);
    UIElement templateRoot = template.LoadContent() as UIElement;
    templateRoot.Measure(maxSize);
    Size size = templateRoot.DesiredSize;

ただし、これを機能させるには、実際にテンプレートで高さを指定する必要があります。高さだけを気にしていると思うので、幅は 0 のままにしました。

テンプレートの高さを取得したら、おそらく、どのオブジェクトがどのページにあるかを追跡する何らかのマップを設定する必要があります。これは、サイズが変更されるか、アイテムのソースが変更されるたびに再作成する必要があります。

その後、どのページにあるかに基づいて、コントロール内に含まれるパネルの子として項目を追加するだけです。

それが私がそれをやろうとする方法です..これがまったく意味がある場合:)

于 2009-05-13T13:56:15.600 に答える
0

a を構築するまで直接測定することは実際には不可能UIElementですが、リスト要素を構築して、それらがどれだけのスペースを占有するかを事前に知ることができる場合があります。たとえば、 を使用Gridして各要素をレイアウトしheaderHeight、ヘッダーの既知の高さの行 (たとえば ) と、各サブアイテムの既知の高さの行(たとえば ) を使用できsubitemHeightます。headerHeightその後、フォーラム+ numSubitems*によって各要素の高さを計算できますsubitemHeight。また、項目の数がかなり少ない (1000 未満など) ことがわかっている場合は、その時点でパフォーマンスの低下が許容できる可能性があるため、事前にすべての項目を作成することをお勧めします。

この種のことが煩わしい場合があることに同意しますが、問題を引き起こすのはフレームワークの非常に柔軟性です。この高さの計算の問題が、ListBox または ListView 内の項目のスムーズなスクロール (ただし仮想化されたもの) のリストを作成することを非常に困難にしています。

于 2009-05-13T14:08:45.643 に答える