Câu trả lời trước đó từ Tony Borres đã bao gồm các khía cạnh quan trọng nhất. Nhưng nhận xét tiếp theo yêu cầu truy cập từ mã phía sau. Vì vậy, tôi cũng sẽ mở rộng ví dụ từ Tony để thể hiện khía cạnh này. Câu trả lời này cho thấy các không gian tên được yêu cầu. Tôi cũng đã thêm chúng vào câu trả lời từ Tony.
Để đơn giản làm cho mã dễ quản lý hơn, bạn nên xác định dữ liệu của từng tab trong điều khiển người dùng, nhưng vẫn có TabItem trong điều khiển tab chính. Chiến lược này hữu ích cho ví dụ để làm việc xung quanh FxCop CA1505: "Tránh mã không thể duy trì" khi sử dụng điều khiển tab với một số mục tab.
Giả sử rằng đây là mã gốc:
<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>
Để làm cho mã dễ quản lý hơn các nội dung tab có thể được chuyển thành một UserControl như:
<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>
Và sau đó có thể sử dụng điều khiển người dùng mới trong TabControl như sau:
<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>
Bây giờ có thể để truy cập vào bộ râu trong của điều khiển người dùng từ cửa sổ chính và ngược lại. Xin lưu ý "x:" ở phía trước tên của người dùng.
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";
}
}
Mã được hiển thị để truy cập txtData2 sẽ giống nhau ngay cả khi được nhúng trong điều khiển người dùng riêng.
Cảm ơn bạn rất nhiều. Nó hoạt động hoàn hảo như bạn thể hiện trong câu trả lời của bạn! –
tabdata đến từ đâu? –
Bạn nhận được thuộc tính 'xmlns' hoạt động như thế nào? Theo như tôi biết, nó đòi hỏi phải ở trong một hội đồng nước ngoài. –