C# 如何在WPF中重用XAML标记?
我想知道是否有可能代替我复制XAML中的代码片段,来定义我可以链接到的东西。更具体地说,我所拥有的是:C# 如何在WPF中重用XAML标记?,c#,wpf,xaml,C#,Wpf,Xaml,我想知道是否有可能代替我复制XAML中的代码片段,来定义我可以链接到的东西。更具体地说,我所拥有的是: <Grid> // Definitions <Label Content="Name:" /> <Label Content="Age:" Grid.Column="1"/> ... <Grid> //定义 ... 现在我想要一些类似于的东西,它应该简单地复制这些标签 注意:我不想要网格,因为我想用不同的属性绑定一些标签 PS
<Grid>
// Definitions
<Label Content="Name:" />
<Label Content="Age:" Grid.Column="1"/>
...
<Grid>
//定义
...
现在我想要一些类似于
的东西,它应该简单地复制这些标签
注意:我不想要网格,因为我想用不同的属性绑定一些标签
PS:也许从另一个角度来看,想象一下我想用WPF创建一个文件属性比较程序。所以你可以想象,我必须再次复制所有这些标签,比如文件名、日期等静态标签,但是为了维护,如果我想将文件名更改为文件名,那么我必须搜索并替换,而不是在一个地方编辑它
提前感谢。将其添加到参考资料中:
<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>
将其添加到参考资料中:
<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>
艾瑞克的回答几乎是正确的 但是我添加了
x:Shared=“False”
,因为否则资源只能使用一次,并且只能在最后一个ContentPresenter中可见。(它在VisualStudio中的所有ContentPresenter中都可见,但在最终应用程序中不可见)
PS:我看到Flat Eric编辑了他的答案,所以x:Shared不再是必要的了。无论如何,最初的答案应该是这样的:
<Grid x:Key="MyGrid" x:Shared="False" >
<Label Content="Name:"/>
<Label Content="Age:" Grid.Column="1"/>
</Grid>
艾瑞克的回答几乎是正确的 但是我添加了
x:Shared=“False”
,因为否则资源只能使用一次,并且只能在最后一个ContentPresenter中可见。(它在VisualStudio中的所有ContentPresenter中都可见,但在最终应用程序中不可见)
PS:我看到Flat Eric编辑了他的答案,所以x:Shared不再是必要的了。无论如何,最初的答案应该是这样的:
<Grid x:Key="MyGrid" x:Shared="False" >
<Label Content="Name:"/>
<Label Content="Age:" Grid.Column="1"/>
</Grid>
您所描述的是基于一组项目(您提到了一个文件属性比较工具,所以我猜它可能是一个文件属性列表)对内容进行模板化 实际上,您不会将
标签
一次又一次地添加到网格
,而是让绑定
系统(在您的情况下)使用头数据控件
,例如数据网格
<DataGrid ItemsSource="{Binding FileProperties}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}" Header="Name:"/>
<DataGridTextColumn Binding="{Binding PropertyValue}" Header="Age:"/>
</DataGrid.Columns>
</DataGrid>
NB:ItemsSource
中使用的FileProperties
通常是具有PropertyName
和PropertyValue
属性的类型的observedcollection
您可以使用
ItemsControl
和一些静态XAML作为标题来实现类似的效果,但总体而言,这要整洁得多。您所描述的是基于项目集合对内容进行模板化(您提到了一个文件属性比较工具,所以我猜它可能是一个文件属性列表)
实际上,您不会将标签
一次又一次地添加到网格
,而是让绑定
系统(在您的情况下)使用头数据控件
,例如数据网格
<DataGrid ItemsSource="{Binding FileProperties}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}" Header="Name:"/>
<DataGridTextColumn Binding="{Binding PropertyValue}" Header="Age:"/>
</DataGrid.Columns>
</DataGrid>
NB:ItemsSource
中使用的FileProperties
通常是具有PropertyName
和PropertyValue
属性的类型的observedcollection
使用
ItemsControl
和一些用于标题的静态XAML可以实现类似的效果,但总体来说这要整洁得多。我认为这不起作用,因为一个元素一次只能在一个地方。。。一个资源只实例化一次…但我不想有“网格”标签,只有标签标签。所以:
,因为我已经有了网格,如果我这样做了,我会在网格中得到一个网格吗?我看不出有什么问题为什么不能在网格中有一个网格不,我只是不想这样做,因为:。。。我只想复制这些静态标签,因为在不同的网格中,我也使用相同的静态标签。@Snowflake您可以用这两个标签创建一个usercontrol,然后只为它添加一个名称空间,您就可以这样使用它。我想这行不通,因为一个元素一次只能在一个地方。。。一个资源只实例化一次…但我不想有“网格”标签,只有标签标签。所以:
,因为我已经有了网格,如果我这样做了,我会在网格中得到一个网格吗?我看不出有什么问题为什么不能在网格中有一个网格不,我只是不想这样做,因为:。。。我只想复制这些静态标签,因为在不同的网格中,我也使用相同的静态标签。@Snowflake您可以使用这两个标签创建一个usercontrol,然后只需为它添加一个名称空间,您就可以这样使用它。我认为这种作业正是用户控件存在的目的。我认为这种作业正是用户控件存在的目的。。。