Tony Borres 之前的回答已经涵盖了最重要的方面。但进一步的评论要求从后面的代码访问。所以我将扩展 Tony 的例子来展示这个方面。这个答案显示了所需的命名空间。我也将它们添加到托尼的答案中。
为了使代码更易于管理,建议在用户控件中定义每个选项卡的数据,但在主选项卡控件中仍保留 TabItem。例如,此策略可用于解决 FxCop CA1505:在使用具有多个选项卡项的选项卡控件时“避免不可维护的代码”。
假设这是原始代码:
<Window x:Class="WpfApplication19.MainWindow" ...>
<TabControl>
<TabItem Header="Tab 1">
<Grid>
<TextBlock Text="Data on Tab 1" Name="txtData1" />
</Grid>
</TabItem>
<TabItem Header="Tab 2">
<Grid>
<TextBlock Text="Data on Tab 2" Name="txtData2" />
</Grid>
</TabItem>
</TabControl>
</Window>
为了使代码更易于管理,可以将选项卡内容移动到 UserControl 中,例如:
<UserControl x:Class="WpfApplication19.Tab1Data"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnControlLoaded"
>
<Grid>
<TextBlock Text="Data on Tab 1" Name="txtData1" />
</Grid>
</UserControl>
然后可以像这样在 TabControl 中使用新的用户控件:
<Window x:Class="WpfApplication19.MainWindow"
xmlns:tabData="clr-namespace:WpfApplication19" ...>
<TabControl>
<TabItem Header="Tab 1">
<tabData:Tab1Data x:Name="ucTab1Data" />
</TabItem>
<TabItem Header="Tab 2">
<Grid>
<TextBlock Text="Data on Tab 2" Name="txtData2"/>
</Grid>
</TabItem>
</TabControl>
</Window>
现在可以从主窗口访问用户控件的内部小部件,反之亦然。请注意用户控件名称前面的“x:”。
public partial class MainWindow : Window
{
private void AccessWidgetWithinUserControl()
{
ucTab1Data.txtData1.Text = "New text on Tab 1";
}
}
public partial class Tab1Data : UserControl
{
private MainWindow mainWindow = null; // Reference to the MainWindow
public Tab1Data()
{
InitializeComponent();
}
// get a reference to main windows when it is available.
// The Loaded Event is set in the XAML code above.
private void OnControlLoaded(object sender, RoutedEventArgs e)
{
mainWindow = Window.GetWindow(this) as MainWindow;
}
private void AccessMainWindowsWidget()
{
mainWindow.txtData2.Text = "New text on Tab 2 in the main window";
}
}
即使嵌入在自己的用户控件中,显示的访问 txtData2 的代码也是相同的。