【问题标题】:how to get the fontsize of a certain line in a richtextbox in c# using winforms如何使用winforms在c#的richtextbox中获取某一行的字体大小
【发布时间】:2020-10-30 02:42:28
【问题描述】:

我有 2 个用于字体和字体大小的组合框。当我单击它们时,它会更改字体大小或我的richtextbox 中的字体。现在我希望它像文字一样工作。如果您刚刚移动到的行的字体或大小不同。它应该检测到并更改组合框以匹配当前行的字体和大小。其他人问了同样的问题,得到的结果对我不起作用。如下

    private void richTextBox1_SelectionChanged(object sender, EventArgs e)
    {
        MessageBox.Show("we got here"); // this is my added part to let me know if the code is even getting executed. It is not.
        richTextBox1.SelectionStart = 1;
        richTextBox1.SelectionLength = 1;
        comboBox1.Text = richTextBox1.SelectionFont.ToString();
        comboBox2.Text = null;
        comboBox2.Text = richTextBox1.SelectionFont.Size.ToString();

    }

我希望这是我的答案,但我看不出在未选择任何内容时 SelectionFont 会有什么不同。此外,当我使用向上/向下箭头浏览文档时,似乎没有调用richTextBox1_SelectionChanged 事件。问题不在于组合框,问题在于当我浏览我的文档时,我需要能够知道插入符号位置的字体和大小,以便它可以触发一个事件来更改组合框以匹配。

【问题讨论】:

    标签: c# winforms fonts richtextbox selectionchanged


    【解决方案1】:

    您使用的代码将始终从索引1 处的字符中进行选择,长度为1。相反,您需要使用它将为您提供以下代码而不指定选择(因此它将从 ritchTextBox 中获取选择)。

    string fontName = richTextBox1.SelectionFont.Name;
    float fontsize = richTextBox1.SelectionFont.Size;
    

    【讨论】:

      【解决方案2】:

      你应该将新组合框位置的值临时保存在变量中,否则如果你直接这样做

      comboBox1.SelectedIndex = comboBox1.FindStringExact(richTextBox1.SelectionFont.Name);
      

      comboBox1_SelectedIndexChanged 事件将被立即调用并可能影响结果。

      那就试试吧:

      private void richTextBox1_SelectionChanged(object sender, EventArgs e)
      {
          int comboBox1Index = comboBox1.FindStringExact(richTextBox1.SelectionFont.Name);
          int comboBox2Index = comboBox2.FindStringExact(richTextBox1.SelectionFont.Size.ToString());
      
          comboBox1.SelectedIndex = comboBox1Index;
          comboBox2.SelectedIndex = comboBox2Index;
      }
      

      【讨论】:

      • 问题是选择更改事件永远不会被调用。无论我在文档中的哪个位置,它仍然显示我使用的最后一个字体。
      • 那么它与您的 RichTextBox 和事件处理有关。在我的测试示例中,它工作正常。 s000.tinyupload.com/index.php?file_id=87205811287792650699
      • 查看了您的示例并将所有内容复制到我的事件中,但在我的解决方案中仍然无法正常工作 comboBox1.SelectedIndex = 0;组合框2.SelectedIndex = 0;抛出 SelectIndex 不能为 0 的异常
      • 我知道它有效,因为它适用于您的表单我只需要尝试找出我的表单中的冲突,即永远无法达到 rtb 选择更改事件。
      • 检查设计器文件是否为 rtb 正确添加了事件。 this.richTextBox1.SelectionChanged += new System.EventHandler(this.richTextBox1_SelectionChanged); 在 VS2015 中显示函数上方的引用数量,应该为 1。否则右键单击 richTextBox1_SelectionChanged 函数名称并选择“查找所有引用”
      【解决方案3】:

      我改编了 Sujith 的解决方案和 Markus 的一半解决方案,并提出了以下对我来说很好用的方法:

      Private Sub Description_SelectionChanged(sender As Object, e As EventArgs) Handles Description.SelectionChanged
      
          Dim fontName As String = Description.SelectionFont.Name
          Dim fontSize As Single = Description.SelectionFont.Size
      
          tbSelectFont.Text = fontName
          tbSelectSize.Text = fontSize
      
      End Sub
      

      【讨论】:

      • 在我上面的评论中,(描述 = RichTextBox)。为了测试代码,我在我的程序的 RTB 中写了一个简短的短语,将它复制并粘贴了几次,一个接一个,更改了几行的字体和大小,然后将光标移动到每一个修改的行。我的字体选择器组合框和字体大小组合都滚动到每行的适当字体和大小,而不选择任何文本。我还通过更改一行中单个字符的字体和大小来检查这一点,它也可以按预期工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2010-11-04
      • 1970-01-01
      • 2023-03-27
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多