2

XYプロパティを持つオブジェクトのリストがあります。コレクションを入れて、ItemsControl各アイテムをその x と y に従って配置したいと考えています。

X または Y の最大値がわかりません。

ItemsControl.ItemsPanel として使用しようとしましCanvasたが、Canvas は子に基づいてサイズを変更しません。したがって、ScrollViewer は ItemsControl をスクロールできません。

確認しました How to Visible ScrollBar In Items Panel With Canvas as ItemsPaneltemplate . 最初の解決策は、Grid を使用して Margin を設定することです。ただし、Thickness.X と Thickness.Y は依存関係プロパティではなく、バインドできません。2 番目の解決策は問題ありませんが、コード ビハインドが含まれます。最後の解決策も機能するはずですが、新しいクラスを作成するのは面倒です。

ItemsControl に項目を配置してスクロールを有効にする方法は? あなたはどのソリューションを好みますか?

4

1 に答える 1

1

Thickness.X と Thickness.Y は依存プロパティではありませんが、Margin は依存プロパティです。X 値と Y 値を含むオブジェクトを受け入れる ValueConverter を定義するか、X 値と Y 値を受け入れる MultiValueConvert を定義するだけです。どちらの実装も Thickness を返します。

<YourElement.Margin>
    <MultiBinding Converter="{StaticResource myMarginConverter}">
      <Binding Path="X"/>
      <Binding Path="Y"/>
    </MultiBinding>
</YourElement.Margin>

.

public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        //Validate parameters...

        Thickness margin = new Margin(values[0], values[1], 0d, 0d);

        return margin;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        //Validate parameters...

        double x = ((Thickness)value).Left;
        double y = ((Thickness)value).Top;

        return new object[]{x, y};
    }
}

私はこのコードをテストしていませんが、画像は得られます。どちらのアプローチが優れているかというと、Canvas を使用することは、意図した目的のために設計されたコントロールのように思えます。ただし、それはあなたがしようとしていることの詳細に依存します。多くのポイントを期待している場合、canvas は仮想化により効率が向上する可能性があると思います。インタラクティブにする必要がない場合は、ビットマップ イメージに描画することもできます。

于 2013-09-17T17:26:30.423 に答える