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();
}
}
}
创意只要释放TextBox上的ListBoxItem,就可以获得鼠标事件的坐标。有了这些,你可以尝试通过计算在开始和鼠标事件之间的字母来找到这个单词。知道了这个单词,就可以修改TextBox。文本相应地用新的子字符串替换旧的子字符串。
结论我不认为这种方法是特别健壮的,因为它取决于字符的宽度,但它至少应该工作。看看WPF的TextBox API,没有高级别的支持。
http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.aspx