我有一个带有Canvas的WPF窗口,用于显示地形图。我想根据IEnumerable<MapSymbolDefinition>
在此地图上放置符号,其中MapSymbolDefinition
的定义如下:
public class MapSymbolDefinition
{
string SymbolFileName { get; set; }
int XLocation { get; set; }
int YLocation { get; set; }
}
所有符号都存储在我项目的Symbols文件夹中,因此任何符号的路径都是[ProjectFolder] /Symbols/SymbolFileName.bmp。
关于我如何设置它的任何想法所以我不必在代码隐藏中手动填充一堆Image对象?
感谢。
答案 0 :(得分:2)
使用自定义ItemsControl
,ItemsPanel
和ItemContainerStyle
的{{1}}:
ItemTemplate
评论后更新:您可以定义<ItemsControl ItemsSource="{Binding MapSymbols}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Top" Value="{Binding YLocation}"/>
<Setter Property="Canvas.Left" Value="{Binding XLocation}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:MapSymbolDefinition}">
<Image Source="{Binding SymbolFileName, Converter={StaticResource ImageNameConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
,为集合中的每个项目提供可视化树。在这种情况下,我使用转换器将ItemTemplate
属性转换为图像,但您可以在SymbolFileName
类上定义一个单独的属性,以生成完整路径。后一种方法更符合MVVM最佳实践。
答案 1 :(得分:0)
WPF方式:使用DataTemplates和ListBox和转换器....查看this example。
快速方法:只需在代码隐藏中执行此操作,并将视图称为控件。