2017-06-28 3 views
0

Wenn der Benutzer auf meine RichEditBox klickt, sollte der Einfügezeiger am Anfang der Zeile und nicht am Ende der Zeichenfolge angezeigt werden. Angenommen, die RichEditBox kann 5 Zeilen für ihre Height enthalten. Wenn der Benutzer also auf die 3. Zeile klickt, sollte der Einfügezeiger am Anfang der 3. Zeile und nicht an der 1. Zeile stehen. Es ist sehr schwer zu erklären, ich hoffe du verstehst es.Wie wird der Zeilenumbruch bis zur tatsächlichen Höhe von RichEditBox festgelegt?

Um dies zu erreichen, dachte ich standardmäßig an den Zeilenumbruch bis Ende RichEditBox.

Lösung versucht:

I unten Code verwendet, es zu tun, aber es hat nicht funktioniert

var oldActualHeight = PATH_RICH_EDIT_BOX.ActualHeight; 
while (PATH_RICH_EDIT_BOX.ActualHeight <= oldActualHeight) 
{ 
    PATH_RICH_EDIT_BOX.Document.GetText(Windows.UI.Text.TextGetOptions.None, out string a); 
    PATH_RICH_EDIT_BOX.Document.SetText(Windows.UI.Text.TextSetOptions.None, a + Environment.NewLine); 
} 

Mein RichEditBox-Code in XAML

<Page.Resources> 
    <Style x:Key="RichEditBoxStyle" TargetType="RichEditBox"> 
     <Setter Property="MinWidth" Value="{ThemeResource TextControlThemeMinWidth}"/> 
     <Setter Property="MinHeight" Value="{ThemeResource TextControlThemeMinHeight}"/> 
     <Setter Property="Foreground" Value="{ThemeResource TextControlForeground}"/> 
     <Setter Property="Background" Value="{ThemeResource TextControlBackground}"/> 
     <Setter Property="SelectionHighlightColor" Value="{ThemeResource TextControlSelectionHighlightColor}"/> 
     <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/> 
     <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/> 
     <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Auto"/> 
     <Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto"/> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False"/> 
     <Setter Property="TextWrapping" Value="Wrap"/> 
     <Setter Property="Padding" Value="{ThemeResource TextControlThemePadding}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="RichEditBox"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 
         <ContentPresenter x:Name="HeaderContentPresenter" Grid.ColumnSpan="2" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Foreground="{ThemeResource TextControlHeaderForeground}" FontWeight="Normal" Margin="0,0,0,8" Grid.Row="0" Visibility="Collapsed" x:DeferLoadStrategy="Lazy"/> 
         <ScrollViewer x:Name="ContentElement" AutomationProperties.AccessibilityView="Raw" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsTabStop="False" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Grid.Row="1" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="Disabled" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
         <ContentControl x:Name="PlaceholderTextContentPresenter" Grid.ColumnSpan="2" Content="{TemplateBinding PlaceholderText}" Foreground="{ThemeResource TextControlPlaceholderForeground}" IsHitTestVisible="False" IsTabStop="False" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Grid.Row="1"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Page.Resources> 

<Grid Name="MainGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <StackPanel Orientation="Horizontal"> 
     <InkToolbar TargetInkCanvas="{x:Bind PATH_INK_CANVAS}"/> 
     <Button Name="ChangeButton" Content="Change" Click="ChangeButton_Click"/> 
    </StackPanel> 
    <ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Visible" Visibility="Visible"> 
     <Grid> 
      <InkCanvas Name="PATH_INK_CANVAS" Canvas.ZIndex="-1"/> 
      <RichEditBox Name="PATH_RICH_EDIT_BOX" PlaceholderText="Input Text" Style="{StaticResource RichEditBoxStyle}"/> 
     </Grid> 
    </ScrollViewer> 
</Grid> 

Antwort

0

Derzeit gibt ist keine solche API, die jede Zeile RichEditBox bekommen kann. Also, wenn Sie den Cursor zum Anfang der Zeile bewegen wollen. Sie können die Startposition der Linie erhalten und sie fokussieren.

Vor allem sollten Sie den Startpunkt RichEditBox Dokument zu erhalten.

public MainPage() 
{ 
    this.InitializeComponent(); 
    ITextSelection selection = PATH_RICH_EDIT_BOX.Document.Selection; 
    selection.StartPosition = 0; 
    selection.EndPosition = 0; 
    originPoint = new Point(); 
    selection.GetPoint(HorizontalCharacterAlignment.Left, VerticalCharacterAlignment.Baseline, PointOptions.Start, out originPoint); 
} 

Sie haben gleiche X um den Punkt jeder Zeile Startpunkt. So könnten Sie den Zeilenstartpunkt anhand der aktuellen Cursorposition ermitteln.

private void ChangeButton_Click(object sender, RoutedEventArgs e) 
{ 
    Point point = new Point(); 
    ITextSelection selection = PATH_RICH_EDIT_BOX.Document.Selection; 

    var sta = selection.StartPosition; 
    var en = selection.EndPosition; 
    selection.GetPoint(HorizontalCharacterAlignment.Left, VerticalCharacterAlignment.Baseline, PointOptions.Start, out point); 
    point = new Point(originPoint.X, point.Y); 
    var pgformat = selection.ParagraphFormat; 
    selection.SetPoint(point, PointOptions.Start, false); 
    var start = selection.StartPosition; 
    var end = selection.EndPosition; 
    PATH_RICH_EDIT_BOX.Document.Selection.SetRange(start, end + 1); 
    PATH_RICH_EDIT_BOX.Focus(FocusState.Pointer); 
} 

Bitte beachten Sie, dass die Endposition des vorhergehenden Zeile mit einem Leerraum als Startposition der aktuellen Zeile gleich ist. Sie sollten also eine Längenspanne verwenden, um sie zu unterscheiden.

PATH_RICH_EDIT_BOX.Document.Selection.SetRange(start, end + 1); 
+0

Warum setzen Sie den zweiten Codeblock in ein 'Button_Click'-Ereignis? –

+0

Hier ist mein [Code] (https://github.com/Vijay-Nirmal/RichInkTextBox-CustomControl). –

+0

Wann sollte ich die Codes im zweiten Codeblock aufrufen? –

Verwandte Themen