在富文本框中定位列表框

Posted

技术标签:

【中文标题】在富文本框中定位列表框【英文标题】:Positioning listbox within a richtextbox 【发布时间】:2011-12-29 04:25:53 【问题描述】:

我有一个富文本框,里面有一个列表框。我希望列表框位于插入符号下方并随着插入符号的移动而移动。

我该怎么做?

我应该操作listBox.Margin 的前两个值吗?如何操作? 谢谢!

【问题讨论】:

【参考方案1】:

我不确定如何获得插入符号的位置(尽管这是一个很好的问题,我很想知道如何获得),但我知道 RichTextBox 不能包含子元素。

我假设解决方案是将 RichTextBox 和 ListBox 放在 Canvas 中,并在每次 RichTextBox 的文本更改时将 ListBox 定位在插入符号的位置。

但同样,我不知道如何检索插入符号的位置。 :/

【讨论】:

是的,我已经尝试了一段时间:/ 感谢您的帖子!【参考方案2】:

这是我要做的(用你的 ListBox 替换我的 Rectangle):

<Window
    x:Class="Wpf_Playground.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    Height="350"
    Width="525">
    <Grid>
        <RichTextBox
            Margin="0,0,0,32"
            x:Name="rtb"
            SpellCheck.IsEnabled="True"
            SelectionChanged="RtbSelectionChanged"
            TextChanged="RtbTextChanged">
        </RichTextBox>
        <Rectangle
            x:Name="rect"
            Width="30"
            Height="30"
            Fill="#80000000"
            VerticalAlignment="Top"
            HorizontalAlignment="Left"
            IsHitTestVisible="False"/>
        <TextBlock
            x:Name="tb"
            Margin="0"
            VerticalAlignment="Bottom" />
    </Grid>
</Window>

using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace Wpf_Playground

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    
        /// <summary>
        /// Initializes a new instance of the <see cref="MainWindow"/> class.
        /// </summary>
        public MainWindow()
        
            InitializeComponent();
        

        private void RtbSelectionChanged(object sender, RoutedEventArgs e)
        
            this.UpdateCaretInfo();
        

        /// <summary>
        /// The update caret info.
        /// </summary>
        private void UpdateCaretInfo()
        
            var caretRect =
                rtb.CaretPosition.GetCharacterRect(LogicalDirection.Forward);
            tb.Text = caretRect.ToString();

            rect.Margin = new Thickness(
                caretRect.Right, 
                caretRect.Bottom, 
                -caretRect.Right, 
                -caretRect.Bottom);
        

        private void RtbTextChanged(object sender, TextChangedEventArgs e)
        
            this.UpdateCaretInfo();
        
    

【讨论】:

非常感谢!我正在寻找这样的东西:) 太棒了。我查看了 API,但一定错过了这一点。优秀作品。 :)

以上是关于在富文本框中定位列表框的主要内容,如果未能解决你的问题,请参考以下文章

C#无法在富文本框中看到字符串

如何在 C# 的富文本框中将文本添加到用户光标的位置?

java按回车键,光标自动定位到下一个文本框中,

wpf 焦点定位到 文本框开头? 2:如何按Tab,让焦点不进入第3个文本框,意思是在前两个文本框中切换

如何将文本框文本拆分为列表框 C#

WPF 从列表框中拖动项目并放入文本框中