Je voudrais faire un BaseClass
pour tous les widgets, puis construire une ViewModel
qui hérite de cette BaseClass
pour chaque widget, ainsi qu'un View
pour aller avec ce ViewModel
Après cela, j'aurais quelque chose comme ObservableCollection<WidgetBaseViewModel> OpenWidgets
dans l'application principale ViewModel
, et le lier à un ItemsControl
.
Le ItemsControl
aurait il est ItemsPanelTemplate
ensemble à un Canvas
, et chaque WidgetBaseViewModel
contiendrait une propriété Top
, Left
, Height
et Width
.
L'interface utilisateur réelle pour afficher chaque Widget avec reposerait sur une DataTemplate
, et pourrait être tout ce que vous voulez, bien qu'un UserControl
serait plus facile
<ItemsControl ItemsSource="{Binding OpenWidgets}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:WidgetAViewModel}">
<local:WidgetAView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:WidgetBViewModel}">
<local:WidgetBView />
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Canvas ... />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
En outre, vous aurez besoin de lier votre Canvas.Top
/Canvas.Left
sur le ItemContainerStyle
au lieu de sur le ItemTemplate
réel pour l'afficher correctement dans la toile.