我想知道是否有可能代替我在XAML中复制代码片段来定义我可以链接到的东西。更具体地说,我所拥有的是:
<Grid>
// Definitions
<Label Content="Name:" />
<Label Content="Age:" Grid.Column="1"/>
...
<Grid>
现在我想要<Content_in_grid=nice_labels>
这样的东西,它应该只是复制这些标签。
注意:我不想要网格,因为这些是我想用不同属性绑定的标签。
PS:也许是一个不同的视角,想象一下我想用WPF创建一个文件属性比较程序。因此,您可以想象我必须再次复制所有这些标签,例如文件名,日期等静态标签,但为了可维护性,如果我想将文件名更改为文件,那么我将不得不搜索和替换而不是编辑它的地方。
提前致谢。
答案 0 :(得分:6)
将其添加到资源中:
<Window.Resources>
<DataTemplate x:Key="MyGrid">
<Grid>
<Label Content="Name:" />
<Label Content="Age:" Grid.Column="1" />
</Grid>
</DataTemplate>
</Window.Resources>
然后在您想要的地方使用它:
<StackPanel>
<ContentPresenter ContentTemplate="{StaticResource MyGrid}" />
<ContentPresenter ContentTemplate="{StaticResource MyGrid}" />
<ContentPresenter ContentTemplate="{StaticResource MyGrid}" />
</StackPanel>
答案 1 :(得分:0)
Flat Eric的答案几乎是正确的。
我添加了»x:Shared =“False”«但是,因为否则资源只能使用一次,并且只能在最后一个ContentPresenter中显示。 (它在VisualStudio中的所有ContentPresenters中都可见,但在最终应用程序中不可见。)
PS:我看到Flat Eric编辑了他的答案,因此x:不再需要共享。无论如何,原来的答案应该是这样的: <Grid x:Key="MyGrid" x:Shared="False" >
<Label Content="Name:"/>
<Label Content="Age:" Grid.Column="1"/>
</Grid>
答案 2 :(得分:0)
您所描述的是根据项目集合模板化内容(您提到了文件属性比较工具,因此我猜它可能是文件属性列表)。
实际上,您不会一遍又一遍地将Labels
添加到Grid
,但会让Binding
系统为您使用(在您的情况下)HeaderedItemsControl
1}}例如DataGrid
。
<DataGrid ItemsSource="{Binding FileProperties}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}" Header="Name:"/>
<DataGridTextColumn Binding="{Binding PropertyValue}" Header="Age:"/>
</DataGrid.Columns>
</DataGrid>
NB :FileProperties
中使用的ItemsSource
通常是ObservableCollection<T>
类PropertyName
和PropertyValue
属性。
你可以使用ItemsControl
和标题的一些静态XAML来达到类似的效果,但总体上要整齐得多。