首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置行中断直到ActualHeight of RichEditBox?

如何设置行中断直到ActualHeight of RichEditBox?
EN

Stack Overflow用户
提问于 2017-06-28 11:58:37
回答 1查看 95关注 0票数 0

如果用户单击我的RichEditBox,那么插入指针应该出现在行的开头,而不是字符串的末尾。例如,假设RichEditBox可以包含其Height的5行,因此当用户单击第3行时,插入指针应该位于第3行的开头,而不是在第1行。很难解释我希望你能理解。

为了实现这一点,我认为默认情况下,可以将换行设置为RichEditBox的末尾。

尝试解决方案:

我使用了下面的代码来完成它,但是它没有工作。

代码语言:javascript
复制
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);
}

My RichEditBox代码在XAML

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2017-06-30 02:19:08

目前,没有任何这样的api可以获取每一行RichEditBox。因此,如果要将光标移动到行的开头。你可以得到线的起始位置并聚焦它。

最重要的是,您应该获得RichEditBox文档的起点。

代码语言:javascript
复制
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);  
}

对于每个行起点的点,它们都有相同的X。所以你可以根据当前光标的位置得到行的起始点。

代码语言:javascript
复制
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);
}

请注意,带有一个空格的前一行的结束位置与当前行的起始位置相同。所以你应该用一个长度范围来区分它们。

代码语言:javascript
复制
PATH_RICH_EDIT_BOX.Document.Selection.SetRange(start, end + 1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44801760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档