首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RichTextBox.Selection和TextSelection.ApplyPropertyValue存在的问题

RichTextBox.Selection和TextSelection.ApplyPropertyValue存在的问题
EN

Stack Overflow用户
提问于 2016-11-08 09:52:49
回答 1查看 505关注 0票数 2

我试图使用RichTextBox在WPF中创建文本编辑器。我的问题是改变文字的字体大小。我的代码在每种情况下都按预期工作,除非光标在一个单词中。在这种情况下,它不应更改任何内容的字体大小,但如果用户写入任何内容,则应更改将要出现的文本的字体大小。问题是,由于某种原因,当光标位于一个单词内时,TextSelection.ApplyPropertyValue(RichTextBox.FontSizeProperty, value)会更改整个单词的字体大小。

这是我的eventHandler:

代码语言:javascript
复制
private void fontSizeBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    string value = (string)comboBox.SelectedValue;

    if (comboBox.IsDropDownOpen)
    {
        TextSelection text = textBoxMain.Selection;
        richTextBox.Focus();
        text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);
    }            
}

而且我不能使用像在if语句中添加!text.Text.IsEmpty这样的方法,因为我仍然需要能够更改要写入的文本的字体大小。

我在StackOverFlow上也发现了类似的问题,但没有一个有实际的工作答案。

编辑:添加XAML

代码语言:javascript
复制
<Window x:Class="MathEdit.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MathEdit"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.CommandBindings>
    <CommandBinding Command="Open" Executed="OpenCommandBinding_Executed"></CommandBinding>
    <CommandBinding Command="Save" Executed="SaveCommandBinding_Executed"></CommandBinding>
    <CommandBinding Command="SaveAs" Executed="SaveAsCommandBinding_Executed"></CommandBinding>
</Window.CommandBindings>

<Window.InputBindings>
    <KeyBinding Key="O" Modifiers="Control" Command="Open"></KeyBinding>
    <KeyBinding Key="S" Modifiers="Control" Command="Save"></KeyBinding>
    <KeyBinding Key="S" Modifiers="Control+Alt" Command="SaveAs"></KeyBinding>
</Window.InputBindings>

<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="_File">
            <MenuItem Header="_New" InputGestureText="Ctrl+N" />
            <MenuItem Header="_Open" InputGestureText="Ctrl+O" Command="Open"/>
            <MenuItem Header="_Save" InputGestureText="Ctrl+S" Command="Save"/>
            <MenuItem Header="_Save As" InputGestureText="Ctrl+Alt+S" Command="SaveAs"/>
            <Separator />
            <MenuItem Header="_Exit" InputGestureText="Alt+F4" />
        </MenuItem>
        <MenuItem Header="_Tools">
            <MenuItem Header="_Check if toby = on" IsCheckable="false" IsChecked="True" Click="MenuItem_Click" />
            <MenuItem Header="_Settings" Click="MenuItem_Click_2" IsCheckable="True" />
            <MenuItem Header="_Add formula" x:Name="menuItemAdd" Click="MenuItem_Add_Click" />
        </MenuItem>
        <ComboBox x:Name="fontSizeBox" Width="40" SelectedValuePath="Content" SelectionChanged="fontSizeBox_SelectionChanged" SelectedIndex="2">
            <ComboBoxItem Content="5"/>
            <ComboBoxItem Content="12"/>
            <ComboBoxItem Content="16"/>
            <ComboBoxItem Content="20"/>
        </ComboBox>
    </Menu>
    <Grid x:Name="gridParent">
    <RichTextBox x:Name="richTextBox" AcceptsReturn="True" SelectionChanged="textBoxMain_SelectionChanged" />
    </Grid>
</DockPanel>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 13:56:55

将属性值简单应用于非文本选择是不可能的。当你把它应用到一个真正的选择时,看看你得到了什么:说你有一条短信“你好,勇敢的新世界”。RTB内部的文档看起来如下(简化)

代码语言:javascript
复制
<FlowDocument>
  <Paragraph>
    <Run>hello brave new world</Run>
  </Paragraph>
</FlowDocument>

当您选择“勇敢”并更改字体大小(或其他任何内容)时,文档将更改为

代码语言:javascript
复制
<FlowDocument>
  <Paragraph>
    <Run>hello </Run>
    <Run FontSize="20">brave</Run>
    <Run> new world</Run>
  </Paragraph>
</FlowDocument>

属性必须应用于某些文本;没有办法按您的要求更改"nothing“。如果您想实现我认为最接近您的需求的目标,您必须自己拆分文档--当选择为空时--并创建一个具有所需字体大小的空运行。因此,上面的示例如下所示(假设插入符位于“勇敢”之前):

代码语言:javascript
复制
<FlowDocument>
  <Paragraph>
    <Run>hello </Run>
    <Run FontSize="20"></Run>
    <Run>brave new world</Run>
  </Paragraph>
</FlowDocument>

由于这样做会留下无限的“空”运行的可能性,我建议修改您的要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40483768

复制
相关文章

相似问题

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