2017-12-20 1 views
1

어제 내 질문에 대한 답변을 작성한 후에이 코드를 작성했지만 "단락"이 RichTextBlockOverflow의 "children"이 아니기 때문에 잘못되었습니다. 그러나 첫 번째 RichTextBlock (저는 이것이 이유). 그래서 RichTextBlockOverflow가 "paragraphlist"의 문단 (예 : 숫자 2)인지 알기를 원합니다.단락이있는 RichTextBlockOverflow 찾기 UWP

발생하는 오류 : System.NullReferenceException : '객체 참조가 설정되지 않았습니다. 개체의 인스턴스에. ' btnParent Button (예제 2)을 클릭하면 생성됩니다.

XAML :

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center"> 
     <Grid x:Name="Menù" Width="290" Padding="0" Margin="40"> 
      <Grid Background="White"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="50"/> 
        <RowDefinition Height="50"/> 
        <RowDefinition Height="50"/> 
       </Grid.RowDefinitions> 
       <Button Grid.Row="0" x:Name="btnLoadText" Click="btnLoadText_Click" Content="Display text" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/> 
       <Button Grid.Row="1" x:Name="btnParent" Click="btnParent_Click" Content="Parent Name" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/> 
       <Button Grid.Row="2" x:Name="btnCount" Click="btnCount_Click" Content="Count" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/> 
      </Grid> 
     </Grid> 
     <Grid x:Name="BaseGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="720" Height="350"> 
      <ScrollViewer x:Name="PageViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Visible" VerticalScrollMode="Disabled" HorizontalScrollMode="Enabled" Background="LightGreen"> 
       <StackPanel x:Name="StackViewer" Orientation="Horizontal"/> 
      </ScrollViewer> 
     </Grid> 
    </StackPanel> 
</Grid> 

코드 : RichTextBlockOverflow 단락 번호 2 명 상주의 이름을 찾을 수

public sealed partial class MainPage : Page 
{ 
    List<Paragraph> paragraphlist = new List<Paragraph>(); 
    RichTextBlock TextOneRich = new RichTextBlock() { Margin = new Thickness(20) }; 
    List<RichTextBlockOverflow> TextList = new List<RichTextBlockOverflow>(); 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     StackViewer.Children.Add(TextOneRich); 
     TextOneRich.Width = 200; 
     TextOneRich.TextAlignment = TextAlignment.Justify; 
     TextOneRich.Name = "RichTextOne"; 
    } 

    private async void btnLoadText_Click(object sender, RoutedEventArgs e) 
    { 
     TextList.Clear(); 
     TextOneRich.Blocks.Clear(); 
     StackViewer.Children.Clear(); 
     StackViewer.Children.Add(TextOneRich); 

     Paragraph paragraphONE = new Paragraph(); 
     paragraphONE.Inlines.Clear(); 
     paragraphONE.Inlines.Add(new Run { Text = "ONE Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." }); 
     paragraphlist.Add(paragraphONE); 

     Paragraph paragraphTWO = new Paragraph(); 
     paragraphTWO.Inlines.Clear(); 
     paragraphTWO.Inlines.Add(new Run { Text = "TWO Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." }); 
     paragraphlist.Add(paragraphTWO); 

     Paragraph paragraphTHREE = new Paragraph(); 
     paragraphTHREE.Inlines.Clear(); 
     paragraphTHREE.Inlines.Add(new Run { Text = "THREE Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." }); 
     paragraphlist.Add(paragraphTHREE); 

     int ThereIsTexts = 0; 
     int CountName = 1; 
     for (int i = 0; i <= ThereIsTexts; i++) 
     { 
      if (i == 0) 
      { 
       TextOneRich.Blocks.Add(paragraphONE); 
       TextOneRich.Blocks.Add(paragraphTWO); 
       TextOneRich.Blocks.Add(paragraphTHREE); 

       await Task.Delay(300); 

       if (TextOneRich.HasOverflowContent) 
       { 
        TextList.Add(new RichTextBlockOverflow() { Width = 200, Margin = new Thickness(20) }); 
        StackViewer.Children.Add(TextList[TextList.Count - 1]); 
        TextOneRich.OverflowContentTarget = TextList[TextList.Count - 1]; 
        TextList[TextList.Count - 1].Name = "RichOverflo" + CountName.ToString(); 
        CountName += 1; 
        ThereIsTexts += 1; 
       } 
      } 
      else 
      { 
       await Task.Delay(300); 
       if (TextList[TextList.Count - 1].HasOverflowContent) 
       { 
        TextList.Add(new RichTextBlockOverflow() { Width = 200, Margin = new Thickness(20) }); 
        StackViewer.Children.Add(TextList[TextList.Count - 1]); 
        TextList[TextList.Count - 2].OverflowContentTarget = TextList[TextList.Count - 1]; 
        TextList[TextList.Count - 1].Name = "RichOverflo" + CountName.ToString(); 
        CountName += 1; 
        ThereIsTexts += 1; 
       } 
      } 
     } 
    } 

    private async void btnParent_Click(object sender, RoutedEventArgs e) 
    { 
     //// *** Exmple 1 work *** 
     //RichTextBlock parent = (paragraphlist[2] as Paragraph).ElementStart.Parent as RichTextBlock; 
     //string parentName = (parent as RichTextBlock).Name; 
     //var messageDialog = new MessageDialog("The parent is: " + parentName); 
     //await messageDialog.ShowAsync(); 


     //// *** Example 2 not work *** 
     RichTextBlockOverflow parent = (paragraphlist[2] as Paragraph).ElementStart.Parent as RichTextBlockOverflow; 
     string parentName = (parent as RichTextBlockOverflow).Name; 
     var messageDialog = new MessageDialog("The parent is: " + parentName); 
     await messageDialog.ShowAsync(); 
    } 

    private async void btnCount_Click(object sender, RoutedEventArgs e) 
    { 
     var messageDialog = new MessageDialog("The number of Bloks is: " + TextOneRich.Blocks.Count); 
     await messageDialog.ShowAsync(); 
    } 
} 

이 가능합니까?

미리 감사드립니다.

답변

2

이 귀하의 경우에 작동합니다 : 일반적으로

RichTextBlockOverflow parent = paragraphlist[2].ElementStart.VisualParent as RichTextBlockOverflow; 

이 단락은 여러 RichTextBlockOverflow 요소와 RichTextBlock을 차지할 수있다. 당신이 그들 모두를 찾을 필요가 있다면, 처음과 마지막은 다음과 같습니다 그들 사이

var firstOccupiedBlock = paragraph.ElementStart.VisualParent; 
var lastOccupiedBlock = paragraph.ElementEnd.VisualParent; 

그리고 RichTextBlockOverflow 요소는 firstOccupiedBlock부터 체인 RichTextBlockOverflow 요소의 OverflowContentTarget 재산의 길을 추적하여 찾을 수있다 .

+0

잘 작동합니다! – Tibrus

+0

@Tibrus 여러분 환영합니다! –