无法将 C++ 中的 TextBox_TextChanged() 转换为 C#
Posted
技术标签:
【中文标题】无法将 C++ 中的 TextBox_TextChanged() 转换为 C#【英文标题】:Failing to convert TextBox_TextChanged() in C++ To C# 【发布时间】:2012-09-28 11:11:27 【问题描述】:几个月来,我一直在使用 Juce Library 开发 C++。我在我的项目中编写了一个代码,其中文本框的格式被修改为仅具有很少功能的十六进制值:
演示:
12 ab 32 a5 64
现在,如果我的光标在末尾并且我继续按退格键,它会删除一般文本框中发生的值。
现在如果我的光标在a5的开头,我按“删除键”,值应该变成这样:
12 ab 32 56 4
如果我的光标位于 a5 的末尾并且我按下“删除键”,则不会发生任何事情。在输入值时,空格键不应让间距 bw 两个值。只应允许输入 a-f 和 0-9。
此处为 C++ 代码:
void CMSP430CommPanel::textEditorTextChanged (TextEditor& editor)
if(&editor == m_texti2cWrite)
int count = 0;
int location;
String text1 = m_texti2cWrite->getText();
String text = m_texti2cWrite->getText().removeCharacters(" ");
String hexString = String::empty;
int countCaret = m_texti2cWrite->getCaretPosition();
for(int i=0; i < text.length(); i++)
hexString = hexString + String (&text[i], 1);
if((i+1) % 2 == 0)
if(i != text.length()-1)
hexString = hexString + T(" ");
count ++;
count ++;
m_texti2cWrite->setText(hexString,false);
if(text1.length() == m_texti2cWrite->getCaretPosition())
m_texti2cWrite->setCaretPosition(count);
else
m_texti2cWrite->setCaretPosition(countCaret);
我希望在我的 WPF 应用程序中也能正常工作。让我们说 C# 中相同代码的一般实现。
请帮忙!!!
【问题讨论】:
你能把你写的 C# 贴出来,我们可以帮你解决(而不是试图为你写完整的东西)? 这个解决方案有什么作用:***.com/questions/12619165/… ?这行不通? 不,我不知道该怎么做。我从过去几周开始就喜欢这种 C# 语言 :( 我以前从未使用过它 :( @FlorianGl:我想要一个简单的方法。我试图实现给定的相同代码,但没有成功。所以我只想继续采用一般方法而不是基于 MVVM :) 【参考方案1】:试试这个(TextBox 的 TextChanged-Event):
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
TextBox m_texti2cWrite = (TextBox)sender;
int count = 0;
string text1 = m_texti2cWrite.Text;
string text = m_texti2cWrite.Text.Replace(" ", string.Empty);
string hexString = string.Empty;
int countCaret = e.Changes.ToList()[0].Offset;
for (int i = 0; i < text.Length; i++)
hexString += text[i];
if ((i + 1) % 2 == 0)
if (i != text.Length - 1)
hexString = hexString + " ";
count++;
count++;
m_texti2cWrite.Text = hexString;
if (text1.Length == countCaret)
m_texti2cWrite.Select(count, 0);
else
if (e.Changes.ToList()[0].RemovedLength == 0)
m_texti2cWrite.Select(countCaret + 1, 0);
if (string.IsNullOrWhiteSpace(hexString.Substring(countCaret, 1)))
m_texti2cWrite.Select(countCaret + 2, 0);
else
m_texti2cWrite.Select(countCaret, 0);
if (string.IsNullOrWhiteSpace(hexString.Substring(countCaret, 1)))
m_texti2cWrite.Select(countCaret + 1, 0);
编辑(仅接受数字、ControlKeys 或 a-f):
添加这个方法:
private Boolean IsTextAllowed(String text)
string acceptedChars = "ABCDEFabcdef";
foreach (Char c in text.ToCharArray())
if (Char.IsDigit(c) || Char.IsControl(c) || acceptedChars.Contains(c)) continue;
else return false;
return true;
将 TextBox_PreviewTextInput-Event 添加到您的文本框
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
e.Handled = !IsTextAllowed(e.Text);
【讨论】:
使用了你上面的代码。以下问题: 1. 它接受所有内容,即它应该只接受 0-9 和 a-f。 2. 输入 2 个数字后,当我尝试输入第 3 个数字时,光标会转到第一个位置并以相反的方式添加。虽然它删除数字的方式运作良好:) 但每次光标转到第一个位置 好吧,我写了一个代码来限制 oly 到 0-9 和 a-f。现在问题号呢? 2??? :) 问题编号2 应该已经解决了 if (text1.Length == countCaret) m_texti2cWrite.Select(count, 0); else m_texti2cWrite.Select(countCaret, 0);确保你添加了这个,我稍后编辑了这部分。 Bang on @Florian Gl :) 唯一的问题是我在文本框中输入的任何内容都会出现反向。例如。 12 34 56 出现 65 43 21 并且光标在开头。删除,退格一切都很好。就剩下这个问题了:) 不客气。要禁用粘贴,请将 DataObject.Pasting-Event 添加到您的 TextBox 并编写 e.CancelCommand();进入方法。【参考方案2】:public class CMSP430CommPanel
//C++ TO C# CONVERTER WARNING: The original C++ declaration of the following method implementation was not found:
public void textEditorTextChanged(TextEditor editor)
if (editor == m_texti2cWrite)
int count = 0;
int location;
string text1 = m_texti2cWrite.getText();
string text = m_texti2cWrite.getText().removeCharacters(" ");
string hexString = string.empty;
int countCaret = m_texti2cWrite.getCaretPosition();
for (int i = 0; i < text.Length; i++)
hexString = hexString + (string)(text[i], 1);
if ((i + 1) % 2 == 0)
if (i != text.Length - 1)
hexString = hexString + T(" ");
count++;
count++;
m_texti2cWrite.setText(hexString,false);
if (text1.Length == m_texti2cWrite.getCaretPosition())
m_texti2cWrite.setCaretPosition(count);
else
m_texti2cWrite.setCaretPosition(countCaret);
【讨论】:
根据我的说法,C# 中没有 getcaretposition()、gettext() 等可用,尽管有很多方法可以做到。以上是关于无法将 C++ 中的 TextBox_TextChanged() 转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章
无法将 C++ 中的 TextBox_TextChanged() 转换为 C#