Jul*_*ian 5 wpf tabcontrol datatemplate
我在过去的两天里一直在谷歌搜索,无法到达任何地方,我只是无法对tabcontrol的datatemplate中的任何控件做任何事情.
首先,代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
总之这一行:
Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;
Run Code Online (Sandbox Code Playgroud)
抛出错误"System.InvalidOperationException"此操作仅对应用此模板的元素有效.
我从这里得到的这个特殊想法
我已经找到了许多其他方法来做到这一点,但我似乎无法到达任何地方:(希望有人能指出我正确的方向:)
看起来像运行时实例化TabControl的方式有问题.似乎第一次引发SelectionChanged事件时,ContentTemplate还没有准备好被访问.如果再次运行代码并跳过ContentTemplate的第一次访问,您将看到在后续事件中您可以访问此属性而不会抛出异常.
通常可以通过调用Dispatcher.BeginInvoke来克服这些类型的错误,在这种情况下,它允许运行时在执行代码之前完成对选项卡控件的初始化.
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);
}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3770 次 |
| 最近记录: |