c#和WPF文本框中指定字符之间的字选择

本文关键字:之间 字符 选择 WPF 文本 | 更新日期: 2023-09-27 18:15:03

我有一个非常棘手的问题要问你们。

假设我在WPF中创建了一个文本框

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="465" Width="681">
    <Grid>
       <TextBox x:Name="textbox1"/>
    </Grid>
</Window>

据我所知,文本框中保存的值是一个字符串。

现在我在文本框中输入一些文本,比如Hello World! It is a %great% day!

注意great被百分比包围,当这种情况发生时,当用户滚动到该单词时,它会被高亮显示,这样用户就无法编辑该特定单词,使其成为一个变量。我该怎么做呢?

我问这个奇怪的问题的原因是因为我有一个列表框,我可以拖拽项目,并把它们放入我的文本框,但我不希望用户在另一个变量内,也不能把文本变量之间,它必须要么替换它或删除它,如果选择,用户开始打字。

这是我的示例代码,你能告诉我我是否在正确的轨道上吗?

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void listbox1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (listbox1.SelectedItems.Count > 0)
        {
            ListBoxItem mySelectedItem = listbox1.SelectedItem as ListBoxItem;
            if (mySelectedItem != null)
            {
                DragDrop.DoDragDrop(listbox1, "%" + mySelectedItem.Content.ToString()+"%", DragDropEffects.Copy);
            }                
        }
    }
    private void textbox1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effects = DragDropEffects.Copy;
    }
    private void textbox1_PreviewDragOver(object sender, DragEventArgs e)
    {
        DragEventArgs p;
        p = e;
        Point curpos = p.GetPosition(textbox1);
        int pos1;
        pos1 = textbox1.GetCharacterIndexFromPoint(curpos, true) + 1;
        label1.Content = pos1.ToString();
        string TEXT = textbox1.Text;
        if(!textbox1.Text.Length.Equals(0))
        {
            string sLeft = TEXT.Substring(0, pos1);
            string sRight = TEXT.Substring(pos1, TEXT.Length - pos1);
            string sText = "";
            int end, length;
            //instrev funct
            if(sLeft.Contains("%"))
            {
                end = sRight.IndexOf("%") +pos1;
                length = end - pos1+2;
                textbox1.SelectionStart = pos1-1;
                textbox1.SelectionLength = length;
            }
        }
    }
    private void textbox1_Drop(object sender, DragEventArgs e)
    {
        string tstring;
        tstring = e.Data.GetData(DataFormats.StringFormat).ToString();
    }
    private void textbox1_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        Point curpos = e.GetPosition(textbox1);
        int pos1;
       pos1 = textbox1.GetCharacterIndexFromPoint(curpos, true) + 1;
        label1.Content = pos1.ToString();
    }

}
}

c#和WPF文本框中指定字符之间的字选择

创意只要释放TextBox上的ListBoxItem,就可以获得鼠标事件的坐标。有了这些,你可以尝试通过计算在开始和鼠标事件之间的字母来找到这个单词。知道了这个单词,就可以修改TextBox。文本相应地用新的子字符串替换旧的子字符串。

结论我不认为这种方法是特别健壮的,因为它取决于字符的宽度,但它至少应该工作。看看WPF的TextBox API,没有高级别的支持。

http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.aspx