キャンバスに複数の画像を表示したい。キャンバス内でそれらを異なる位置に配置する必要があります。画像のクラスを作成しました:
class MapItem:Image
{
public int DistanceToTop { get; set; }
public int DistanceToLeft { get; set; }
}
私のXAMLは次のようになります:
<UserControl.DataContext>
<Map:MapViewModel/>
</UserControl.DataContext>
<ItemsControl ItemsSource="{Binding All}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="Image">
<Setter Property="Canvas.Left" Value="{Binding DistanceToLeft}" />
<Setter Property="Canvas.Top" Value="{Binding DistanceToTop}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
DataContext として使用される私の ViewModel :
class MapViewModel : ViewModelBase
{
public ObservableCollection<MapItem> All { get; set; }
public MapViewModel()
{
All = new ObservableCollection<MapItem>();
var wSource = new BitmapImage(new Uri(@"ImagePath"));
var wImage = new MapItem { Source = wSource, DistanceToLeft = 20, DistanceToTop = 20 };
test = wImage;
All.Add(wImage);
}
}
XAML で DistanceToLeft と DistanceToTop へのバインドが機能しないのはなぜですか?!? 私の ObservableCollection で使用されているオブジェクトを自動的に調べると思われませんか?
編集:私はまだ問題があります。しかし、今ではそれがバインディングに関連していることを知っています。GalaSoft フレームワークを使用して MVVM パターンを使用して、これらすべてを実装しようとしています。まず、DataContext を MapViewModel に設定します。ObservableCollection から MapItem のプロパティにアクセスできないのはなぜですか?
EDIT : 最後に、クレメンスとレイチェルの助けを借りて、これで終わりました。
私のMapItemクラス:
class MapItem:Image
{
public LatLon CoordMiddleOfImage { get; set; }
public LatLon CoordTopLeftOfImage { get; set; }
public int DistanceToTop
{
get { return (int) Canvas.GetTop(this); }
set { Canvas.SetTop(this, value); }
}
public int DistanceToLeft
{
get { return (int)Canvas.GetLeft(this); }
set { Canvas.SetLeft(this, value); }
}
public int ZOrder
{
get { return Panel.GetZIndex(this); }
set { Panel.SetZIndex(this, value); }
}
}
そして、私のXAMLは次のようになります:
<ItemsControl ItemsSource="{Binding All}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas ClipToBounds="True" SnapsToDevicePixels="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
それは今のところ魅力のように機能します:-)