Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中重用XAML标记?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在WPF中重用XAML标记?

C# 如何在WPF中重用XAML标记?,c#,wpf,xaml,C#,Wpf,Xaml,我想知道是否有可能代替我复制XAML中的代码片段,来定义我可以链接到的东西。更具体地说,我所拥有的是: <Grid> // Definitions <Label Content="Name:" /> <Label Content="Age:" Grid.Column="1"/> ... <Grid> //定义 ... 现在我想要一些类似于的东西,它应该简单地复制这些标签 注意:我不想要网格,因为我想用不同的属性绑定一些标签 PS

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

<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,然后只需为它添加一个名称空间,您就可以这样使用它。我认为这种作业正是
用户控件存在的目的。我认为这种作业正是
用户控件存在的目的。。。