如果我在不同的方法中对文本应用更多样式,为啥会覆盖样式?

Posted

技术标签:

【中文标题】如果我在不同的方法中对文本应用更多样式,为啥会覆盖样式?【英文标题】:Why are styles overwritten if I apply more styles to text in separate methods?如果我在不同的方法中对文本应用更多样式,为什么会覆盖样式? 【发布时间】:2015-04-11 13:50:43 【问题描述】:

我正在为我的反汇编程序编写自定义样式。不幸的是,它似乎总是将样式覆盖为最新的字符,而其他样式则丢失了。这是我的代码调用我的样式:

        if (Base)
        
            ITypeBase Instr = new ITypeBase();
            Instr = BaseTypeSplit(bits, Instr);

            Disassemble._dis.updateOP(CheckOpcode(Instr.opcode) + " ");
            Disassemble._dis.updateREG(CheckReg(Instr.rt));
            Disassemble._dis.updateCOMMA(", ");
            Disassemble._dis.updateIMM(CheckImm(Instr.imm));
            Disassemble._dis.updateREGB("(" + CheckReg(Instr.@base) + ")");
        

是的,我的主要代码从另一个类中调用了 scintilla Box。我使用另一个类 (_dis = this;) 的构造函数来访问它。

这里是我做样式的函数:

    public Disassemble()
    
        InitializeComponent();
        _dis = this;
     

    public static Disassemble _dis;


    public void updateOP(string message)
    
        int length = scintilla1.TextLength; 
        int length2 = message.Length; 
        int sum = length + length2; 

        scintilla1.Styles[1].Font = new Font("Arial", 25, FontStyle.Bold);
        scintilla1.Styles[1].ForeColor = Color.FromArgb(255, 128, 0);
        scintilla1.Text += message;

        int n = length;

        while (length < sum)
        
            scintilla1.GetRange(n).SetStyle(1);
            n = length + 1;
            length += 1;
        
    

    public void updateREG(string message)
    
        int length = scintilla1.TextLength; 
        int length2 = message.Length;
        int sum = length + length2; 

        scintilla1.Styles[2].Font = new Font("Arial", 25, FontStyle.Bold);
        scintilla1.Styles[2].ForeColor = Color.FromArgb(128, 0, 0);
        scintilla1.Text += message;

        int n = length;

        while (length < sum)
        
            scintilla1.GetRange(n).SetStyle(2);
            n = length + 1;
            length += 1;
        
    

    public void updateREGB(string message)
    
        int length = scintilla1.TextLength; 
        int length2 = message.Length; 
        int sum = length + length2; 

        scintilla1.Styles[5].Font = new Font("Arial", 25, FontStyle.Bold);
        scintilla1.Styles[5].ForeColor = Color.FromArgb(172, 172, 172);
        scintilla1.Text += message;

        int n = length;

        while (length < sum)
        
            scintilla1.GetRange(n).SetStyle(5);
            n = length + 1;
            length += 1;
        
    

    public void updateCOMMA(string message)
    
        int length = scintilla1.TextLength;
        int length2 = message.Length;
        int sum = length + length2;

        scintilla1.Styles[3].Font = new Font("Arial", 25, FontStyle.Bold);
        scintilla1.Styles[3].ForeColor = Color.FromArgb(0, 0, 0);
        scintilla1.Text += message;

        int n = length;

        while (length < sum)
        
            scintilla1.GetRange(n).SetStyle(3);
            n = length + 1;
            length += 1;
        
    

    public void updateIMM(string message)
    
        int length = scintilla1.TextLength;
        int length2 = message.Length;
        int sum = length + length2;

        scintilla1.Styles[4].Font = new Font("Arial", 25, FontStyle.Bold);
        scintilla1.Styles[4].ForeColor = Color.FromArgb(0, 0, 255);
        scintilla1.Text += message;

        int n = length;

        while (length < sum)
        
            scintilla1.GetRange(n).SetStyle(4);
            n = length + 1;
            length += 1;
        
    

这就是我得到的,总是:

如您所见,它只设置最新字符的样式,而其他设置样式的字符会丢失样式并被覆盖。

我尝试了一些(可怕的)方法,但它们也没有达到我想要的效果。有人知道这可能是什么原因吗?有关更多信息,我使用 Visual Studio 2012、.NET 4.5

【问题讨论】:

【参考方案1】:

所以,找到了我自己的解决方案。我没有将它放入单独的方法中,而是决定将其放入一个并将我所有的 while 循环放在那里。这是我的结果,它成功了:

    public void updateBase(string opcode, string rt, string comma, string imm, string @base)
    
        int tlen = scintilla1.TextLength; // 12
        int olen = opcode.Length;
        int rlen = rt.Length;
        int clen = comma.Length;
        int ilen = imm.Length;
        int blen = @base.Length;
        int n = 0;

        scintilla1.Text += opcode;
        scintilla1.Text += rt;
        scintilla1.Text += comma;
        scintilla1.Text += imm;
        scintilla1.Text += @base;

        int sumt = tlen + olen;

        while (tlen < sumt)
        
            n = tlen - 1;
            tlen += 1;
            scintilla1.GetRange(n).SetStyle(1);
        

        sumt = tlen + rlen;

        while (tlen < sumt)
        
            n = tlen /*+ 1*/;
            tlen += 1;
            scintilla1.GetRange(n).SetStyle(2);
        

        sumt = tlen + clen;

        while (tlen < sumt)
        
            n = tlen /*+ 1*/;
            tlen += 1;
            scintilla1.GetRange(n).SetStyle(3);
        

        sumt = tlen + ilen;

        while (tlen < sumt)
        
            n = tlen /*+ 1*/;
            tlen += 1;
            scintilla1.GetRange(n).SetStyle(4);
        

        sumt = tlen + blen;

        while (tlen < sumt)
        
            n = tlen /*+ 1*/;
            tlen += 1;
            scintilla1.GetRange(n).SetStyle(5);
        

    

结果如下:

【讨论】:

以上是关于如果我在不同的方法中对文本应用更多样式,为啥会覆盖样式?的主要内容,如果未能解决你的问题,请参考以下文章

为啥范围样式没有加载到 nuxt 页面中?

为啥用户代理样式表会覆盖我的样式? [关闭]

为啥一个不可见的 TableView 会覆盖一个标签?

为啥单击按钮后`JQuery`选项卡会丢失样式

表行样式被 td 样式 css 覆盖

为啥在 IE 10 中 CSS 文本颜色会覆盖占位符颜色?