删除 WPF 的 TabControl 中的重复代码
Remove duplicate code in WPF's TabControl
删除 XAML 代码中的重复代码时遇到问题。
示例:
<TabControl x:Name="TabControl">
<TabItem Header="1">
<TabItem.Content>
<GridView x:Name="GridView1">
...
</GridView>
</TabItem.Content>
</TabItem>
<TabItem Header="2">
<TabItem.Content>
<GridView x:Name="GridView2">
...
</GridView>
</TabItem.Content>
</TabItem>
</TabControl>
选项卡的内容相同,除了 GridView 控件的名称。
我需要通过 XAML 静态创建选项卡,以便在代码隐藏中访问 GridView。
有没有办法将 TabItems 的内容保存在一个地方,以便它可以用于两个 TabItems,但保留在代码隐藏中分别访问两个 GridView 的可能性?
如果您指的是整个 GridView 内容,您可以像创建表单一样创建自己的控件。但不是
<Window x:Class...
other xmlns stuff of window >
[actual content within]
</Window>
只需创建一个包含您的 gridview 内容的文件,例如
<GridView x:Class="classNameOfThisControl"
other xmlsns stuff like that of Window >
[content within the gridview]
</GridView>
然后,在您复制的选项卡控件中,您可以添加此自定义 xaml 内容
<TabControl x:Name="TabControl">
<TabItem Header="1">
<TabItem.Content>
<local:classNameOfThisControl x:Name="GridView1"/>
</TabItem.Content>
</TabItem>
<TabItem Header="2">
<TabItem.Content>
<local:classNameOfThisControl x:Name="GridView2"/>
</TabItem.Content>
</TabItem>
</TabControl>
您在现有项目中看到的“本地”上下文基本上是您自己的项目和在上一步中创建的 class 名称的上下文。很多可以在多个地方得到 re-used 的东西我都是这样做的。想象一个需要姓名和地址的应用程序。为什么要重新创建 20 次。声明相同的网格上下文、列对齐、文本输入等,并在该级别和内部部分分配任何绑定上下文(提供相同的绑定 属性 名称上下文),它可以顺利运行。 HTH
意见反馈
如果您的 [GridView] 更完整并且每个实例都有多个控件并且您想明确了解其中的控件,您仍然可以使用部件的 x:Name 上下文,但您首先需要获取第一个实例 gridview 名称,然后查找其中其他控件的部分。因为 GridView1.SomeTextbox 与 IT 中的 GridView1.SomeTextbox 明显不同。说得通?如果您可以编辑您现有的 post 并且可能提供更多关于您正在尝试做的事情的上下文,可能有助于增加说明。
另一种方法可能是使用某些属性创建您自己的自定义 class,并将这些属性的上下文绑定到知道您的自定义 class 的 pre-defined TEMPLATE/STYLE ] 及其相关的可绑定属性,但这比你现在所处的位置要多一些。
删除 XAML 代码中的重复代码时遇到问题。
示例:
<TabControl x:Name="TabControl">
<TabItem Header="1">
<TabItem.Content>
<GridView x:Name="GridView1">
...
</GridView>
</TabItem.Content>
</TabItem>
<TabItem Header="2">
<TabItem.Content>
<GridView x:Name="GridView2">
...
</GridView>
</TabItem.Content>
</TabItem>
</TabControl>
选项卡的内容相同,除了 GridView 控件的名称。
我需要通过 XAML 静态创建选项卡,以便在代码隐藏中访问 GridView。
有没有办法将 TabItems 的内容保存在一个地方,以便它可以用于两个 TabItems,但保留在代码隐藏中分别访问两个 GridView 的可能性?
如果您指的是整个 GridView 内容,您可以像创建表单一样创建自己的控件。但不是
<Window x:Class...
other xmlns stuff of window >
[actual content within]
</Window>
只需创建一个包含您的 gridview 内容的文件,例如
<GridView x:Class="classNameOfThisControl"
other xmlsns stuff like that of Window >
[content within the gridview]
</GridView>
然后,在您复制的选项卡控件中,您可以添加此自定义 xaml 内容
<TabControl x:Name="TabControl">
<TabItem Header="1">
<TabItem.Content>
<local:classNameOfThisControl x:Name="GridView1"/>
</TabItem.Content>
</TabItem>
<TabItem Header="2">
<TabItem.Content>
<local:classNameOfThisControl x:Name="GridView2"/>
</TabItem.Content>
</TabItem>
</TabControl>
您在现有项目中看到的“本地”上下文基本上是您自己的项目和在上一步中创建的 class 名称的上下文。很多可以在多个地方得到 re-used 的东西我都是这样做的。想象一个需要姓名和地址的应用程序。为什么要重新创建 20 次。声明相同的网格上下文、列对齐、文本输入等,并在该级别和内部部分分配任何绑定上下文(提供相同的绑定 属性 名称上下文),它可以顺利运行。 HTH
意见反馈
如果您的 [GridView] 更完整并且每个实例都有多个控件并且您想明确了解其中的控件,您仍然可以使用部件的 x:Name 上下文,但您首先需要获取第一个实例 gridview 名称,然后查找其中其他控件的部分。因为 GridView1.SomeTextbox 与 IT 中的 GridView1.SomeTextbox 明显不同。说得通?如果您可以编辑您现有的 post 并且可能提供更多关于您正在尝试做的事情的上下文,可能有助于增加说明。
另一种方法可能是使用某些属性创建您自己的自定义 class,并将这些属性的上下文绑定到知道您的自定义 class 的 pre-defined TEMPLATE/STYLE ] 及其相关的可绑定属性,但这比你现在所处的位置要多一些。