1

簡単な質問。水平方向のスタイルのリストボックスの各アイテムの間に仕切りを表示する必要があります。クラムトレイルのエントリ間の矢印を考えてみてください。ただし、その仕切りを選択の一部にしたくないので、実際には各ListBoxItemの間に配置する必要があります。それは可能ですか?

これを行うために私が考えることができる唯一の2つの方法は、「セパレータ」アイテムをデータに挿入し、それらを異なる方法でテンプレート化することですが、これにはアイテムコレクションをいじくり回す必要があり、データバインドの状況では実行できない場合があります。

他の唯一の方法は、実際のListBoxItemのスタイルを設定して、強調表示の境界線の外側に区切り文字を配置し、リストの最後の区切り文字を個別にテンプレート化することです。

誰かがこれを行う他の方法を考えることができますか?

4

2 に答える 2

1

面白い質問です!あなたが言ったように、1つの方法はItemsSourceコレクションをモックすることです。そのような:

<ListBox.ItemsSource>
   <MultiBinding Converter="{StaticResource mockConverter}">
     <Binding Path="YourCustomList" />
   </MultiBinding>
</ListBox.ItemsSource>

バインディングが1つだけのマルチバインディングを使用したことに注意してください。コンバーターを「再実行」するには、これが正しい方法だと思います。このように、「YourCustomList」の項目を変更すると、コンバーターが再トリガーされます。

これとは異なり、コンバーターは1回だけトリガーされます(ItemsSourceが最初にバインドされたとき)

<ListBox ItemsSource="{Binding YourCUstomList, Converter={StaticResource mockCOnverter}}" />

^新しいアイテムを追加すると機能しません(YourCustomListプロパティが変更された場合にのみコンバーターが再実行されます)

MockConverterは簡単です。必ず、セパレータを使用してリストを生成してください。セパレーターには新しいクラスが必要です。このようにして、DataTemplates(DataType)を簡単に使用できます。次に、object=SeperatorのときにIsEnabled=falseを設定するには、ItemContainerStyleで新しいトリガーを設定する必要があります。

比較的痛みはなく、合併症は見られません。セパレータはListBoxItemsであってはならないので、少し醜いです。

おそらくこれもうまくいくでしょう。 ListBoxItemsPanelTemplateを独自のものでオーバーライドできます。独自のテンプレートで、好きなことを行うことができます。おそらくセパレーターを追加します。このように、ItemsSourceに触れることはありません。

コードについてはStackPanel.csをチェックしてください。現在、コードを提供することはできませんが、アイデアはこれです。StackPanelから継承し、Measure()とArrange()を上書きします。これらの関数を使用すると、stackPanelの大きさを計算し、セパレーターを描画する場所(X、y)を指定できます。セパレータはStackPanelの子である必要があり、IsHitTestVisible = Falseである必要があることに注意してください(イベントを生成しないようにするため)。

後のソリューションには時間がかかりますが、WPFを学習している場合は、どうしてですか?

于 2012-08-26T15:49:16.237 に答える
0

DataTemplateは問題ありません。アイテム・コレクションのモックに問題はないと思います。なぜあなたを抱きしめるのですか?

<DataTemplate>
    <StackPanel Orientation="Horizontal">
      <Seperator/>
      <TextBlock Text="{Binding .}"/>
    </StackPanel/>
</DataTemplate>

私はあなたが持っていた最後のオプションをお勧めしません。それはあなたが望むものを達成するためだけにそれを分離したスタイルにするのは正しくありません。

于 2012-08-26T15:20:42.267 に答える