无法从TabControl DataTemplate访问元素

时间:2019-03-11 22:19:03

标签: c# wpf vb.net xaml

1-将以下代码复制并粘贴到 MainWindow.xaml 文件中。

<Window x:Class="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">
<Grid>
    <Button x:Name="Button1" Width="250" Height="25" VerticalAlignment="Top" Content="Copy from RichTextBox1 to RichTextBox2"/>
    <TabControl Margin="0,50,0,0">
        <TabItem Header="TabItem1">
            <RichTextBox x:Name="RichTextBox1">
                <FlowDocument x:Name="FlowDocument1">
                    <Paragraph>
                        <Run Text="England"/>
                        <LineBreak/>
                        <Run FontWeight="Bold" Text="France"/>
                        <LineBreak/>
                        <Run Foreground="Red" Text="Germany"/>
                    </Paragraph>
                </FlowDocument>
            </RichTextBox>
        </TabItem>
        <TabItem Header="TabItem2">
            <Canvas x:Name="Canvas1">
                <Thumb x:Name="Thumb1" Canvas.Left="0" Canvas.Top="0">
                    <Thumb.Template>
                        <ControlTemplate>
                            <RichTextBox x:Name="RichTextBox2" Width="400" Height="200">
                                <FlowDocument x:Name="FlowDocument2" FontFamily="Segoe UI" FontSize="12">
                                    <Paragraph/>
                                </FlowDocument>
                            </RichTextBox>
                        </ControlTemplate>
                    </Thumb.Template>
                </Thumb>
            </Canvas>
        </TabItem>
    </TabControl>
</Grid>
</Window>

2-将以下代码复制并粘贴到后面的代码文件中。

Class MainWindow 
Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
    Dim myMemoryStream As New System.IO.MemoryStream
    Dim FirstTextRange As New TextRange(RichTextBox1.Document.ContentStart, RichTextBox1.Document.ContentEnd)
    FirstTextRange.Save(myMemoryStream, DataFormats.XamlPackage)
    myMemoryStream.Position = 0
    Dim myRichTextBox As New RichTextBox
    myRichTextBox = CType(Thumb1.Template.FindName("RichTextBox2", Thumb1), RichTextBox)
    Dim SecondTextRange As New TextRange(myRichTextBox.Document.ContentStart, myRichTextBox.Document.ContentEnd)
    SecondTextRange.Load(myMemoryStream, DataFormats.XamlPackage)
End Sub
End Class

3-运行此项目,选择 TabItem2 ,单击 Button1 ,了解从RichTextBox1到RichTextBox2的复制已成功完成。

我的问题在这里;

再次运行该项目,选择 TabItem1 ,单击 Button1 ,看到此错误:https://prnt.sc/mwjijx

如您所见;

如果选择了 TabItem2 ,则没有错误,

如果选择了 TabItem1 ,则出现错误。

1 个答案:

答案 0 :(得分:0)

在打开包含Thumb1元素的选项卡之前,似乎没有完全创建该元素。因此,FindName方法找不到RichTextBox2(因此它返回null)。

您可以尝试通过调用其ApplyTemplate方法来强制完全创建Thumb1元素。然后调用FindName方法:

Thumb1.ApplyTemplate()
myRichTextBox = CType(Thumb1.Template.FindName("RichTextBox2", Thumb1), RichTextBox)