0

画像のコレクションを表示するユーザー コントロールを作成しようとしています。画像のコレクションの依存関係プロパティを使用して作成されたユーザー コントロールがあります。そのプロパティにデータバインドして、画像を正常に表示できます。

ただし、コレクションのサイズをハードコーディングしており、任意の数の画像を取り込んで表示したいと考えています。

画像のコレクションに基づいて画像を動的に作成する方法がわかりません。依存関係プロパティの内容に基づいて、応答してイメージを作成したいイベントがあると確信しています。

public sealed partial class ImageView : UserControl
    {

        public ImageView()
        {
            this.InitializeComponent();

            scrollViewer.ZoomSnapPoints.Clear();
            scrollViewer.ZoomSnapPoints.Add(0.2f);
            scrollViewer.ZoomSnapPoints.Add(0.6f);
            scrollViewer.ZoomSnapPoints.Add(1.0f);
            scrollViewer.ZoomSnapPoints.Add(1.4f);
            scrollViewer.ZoomToFactor(0.4f);

        }


        public static readonly DependencyProperty ImagesProperty = DependencyProperty.Register("Images",
            typeof(List<VMImage>), typeof(ImageView), new PropertyMetadata(new List<VMImage>(12)));


        public List<VMImage> Images
        {
            get { return (List<VMImage>)GetValue(ImagesProperty); }
            set { SetValue(ImagesProperty, value); }
        }


    }


<ScrollViewer Height="700" Width="700"
                      x:Name="scrollViewer"
                      MinZoomFactor="0.2"
                      MaxZoomFactor="5.0"
                      ZoomSnapPointsType="Mandatory">

        <Canvas Background="Black" Width="2000" Height="2000" >

            <Image Canvas.Left="{Binding Images[0].Location.X}" 
                   Canvas.Top="{Binding Images[0].Location.Y}"
                   Source="{Binding Images[0].Source}" ></Image>
            <Image Canvas.Left="{Binding Images[1].Location.X}" 
                   Canvas.Top="{Binding Images[1].Location.Y}"
                   Source="{Binding Images[1].Source}" ></Image>
        </Canvas>

    </ScrollViewer>
4

1 に答える 1

1

依存関係プロパティをObservableCollection<VMImage>. このようにして、ハンドラーをそのCollectionChangedイベントにアタッチし、変更の通知を受け取ることができます。依存関係プロパティの変更されたコールバックで、イベント ハンドラーを新しい値に追加し、古い値から削除することを確認してください。

public static readonly DependencyProperty ImagesProperty = DependencyProperty.Register("Images",
    typeof(ObservableCollection<VMImage>), typeof(ImageView), new PropertyMetadata(null, OnImagesChanged));

public ObservableCollection<VMImage> Images
{
    get { return (ObservableCollection<VMImage>)GetValue(ImagesProperty); }
    set { SetValue(ImagesProperty, value); }
}

private static void OnImagesChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
    // use wrapper to pass DependencyObject to handler
    NotifyCollectionChangedEventHandler handler = (s, args) => OnCollectionChanged(target, args);
    if (e.OldValue is ObservableCollection<object>)
        (e.OldValue as ObservableCollection<object>).CollectionChanged -= handler;
    if (e.NewValue is ObservableCollection<object>)
        (e.NewValue as ObservableCollection<object>).CollectionChanged += handler;

    var imageView = target as ImageView
    if (imageView != null)
    {
        // collection has changed completely, replace all images
    }
}

static void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    var imageView = sender as ImageView;
    if (imageView != null)
    {
        if (e.OldItems != null)
        {
            // remove images
        }
        if (e.NewItems != null)
        {
            // add images
        }
    }
}
于 2012-12-19T06:09:46.360 に答える