Не удается получить доступ к элементу из шаблона данных TabControl - PullRequest
0 голосов
/ 12 марта 2019

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 голосов
/ 12 марта 2019

Кажется, что элемент Thumb1 не создан полностью, пока вы не откроете вкладку, в которой он находится.Следовательно, метод FindName не может найти RichTextBox2 (поэтому он возвращает null).

Вы можете попытаться принудительно создать элемент Thumb1, вызвав его ApplyTemplate метод.Затем вызовите метод FindName:

Thumb1.ApplyTemplate()
myRichTextBox = CType(Thumb1.Template.FindName("RichTextBox2", Thumb1), RichTextBox)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...