无法将 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++中的向量

无法将 C++ 中的 TextBox_TextChanged() 转换为 C#

无法将派生类 push_back() 推入 C++ 中的 STL 列表

无法将 Qml 信号连接到 C++ 插槽

无法将短裤复制到动态数组 C++

无法将 Python 算法翻译成 C++