datatemplate - wpf无法从 TabControl DataTemplate获取控件

  显示原文与译文双语对照的内容
58 5

我已经经在最近 2天搜索过这个信息,不能在任何控制中任何控制。

首先,代码:

private void Window_Loaded(object sender, RoutedEventArgs e) {
 tabControl1.ItemsSource = new string[] {"TabA","TabB","TabC" };
}
private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e) {
 ContentPresenter cp = tabControl1.Template.FindName("PART_SelectedContentHost", tabControl1) as ContentPresenter;
 DataTemplate dt = tabControl1.ContentTemplate;
 Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;
 g.Background = new SolidColorBrush(Colors.Red);
}

Xaml

<Window x:Class="tabTest.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
 <TabControl IsSynchronizedWithCurrentItem="True" Height="140" Name="tabControl1" Width="230" SelectionChanged="tabControl1_SelectionChanged">
 <TabControl.ContentTemplate>
 <DataTemplate>
 <Grid x:Name="myGrid"> 
 </Grid>
 </DataTemplate> 
 </TabControl.ContentTemplate> 
 </TabControl>
</Grid>

简而言之,这一行:

Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;

引发错误"系统。invalidoperationexception"这里操作仅对已经应用这里模板的元素有效。

这是我从那里得到的这个特殊的想法。

我找到了它的他的方法,但我看不到任何地方:( 希望有人能指向我正确的方向) 。

时间:原作者:0个回答

130 5

看起来run运行时TabControl被实例化的问题。看起来第一次引发arraylist事件时,is不能够被访问。如果再次运行代码,然后跳过第一个访问,你可以以在后面的事件中访问该属性。

通常,这种类型的错误可以以通过调用your来克服,在执行代码之前,它允许运行时完成tab控件。

Dispatcher.BeginInvoke(new Action(() =>
 {
 ContentPresenter cp = tabControl1.Template.FindName("PART_SelectedContentHost", tabControl1) as ContentPresenter;
 Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;
 g.Background = new SolidColorBrush(Colors.Red);
 }));
原作者:
...