在WPF中重用XAML代码

时间:2014-11-28 12:30:15

标签: c# wpf

我想知道是否有可能代替我在XAML中复制代码片段来定义我可以链接到的东西。更具体地说,我所拥有的是:

<Grid>

 // Definitions

 <Label Content="Name:" />
 <Label Content="Age:" Grid.Column="1"/>
 ...
 <Grid>

现在我想要<Content_in_grid=nice_labels>这样的东西,它应该只是复制这些标签。

注意:我不想要网格,因为这些是我想用不同属性绑定的标签。

PS:也许是一个不同的视角,想象一下我想用WPF创建一个文件属性比较程序。因此,您可以想象我必须再次复制所有这些标签,例如文件名,日期等静态标签,但为了可维护性,如果我想将文件名更改为文件,那么我将不得不搜索和替换而不是编辑它的地方。

提前致谢。

3 个答案:

答案 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>PropertyNamePropertyValue属性。

你可以使用ItemsControl和标题的一些静态XAML来达到类似的效果,但总体上要整齐得多。