溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于WPF中TextBox行的選擇與顯示的問題

發(fā)布時(shí)間:2020-06-29 01:57:11 來源:網(wǎng)絡(luò) 閱讀:2647 作者:傳奇之旅 欄目:編程語言

        最近做了一個(gè)小工具,其中用到了WPF中的TextBox控件。對(duì)于這個(gè)控件的使用,其中主要的一個(gè)功能是需要選擇指定的行,并將其顯示在控件可見區(qū)域的視圖中(如果不在可視區(qū)域時(shí),需要控件自動(dòng)滾動(dòng)到改行)。在我使用時(shí),發(fā)現(xiàn)一個(gè)問題,如果當(dāng)我先將指定的行滾動(dòng)至視圖中,然后在將其選中,則經(jīng)常會(huì)不穩(wěn)定,有時(shí)能定位并選中,有時(shí)則會(huì)選中錯(cuò)誤位置,或者報(bào)錯(cuò)?,F(xiàn)在我想將我遇到的問題以代碼的方式進(jìn)行說明,以及我的解決方案。不過,目前其原因還未搞明白,如果有高人,還請(qǐng)給予指點(diǎn)。

        首先,在自定義控件中添加一個(gè)TextBox控件,命名為txtBoxDocument,并在控件中提供兩個(gè)公共方法GoToLine(int rowIndex)和SelectedLine(int rowIndex),用來定位并滾動(dòng)至指定行和選中改行。

        /// <summary>
        /// 定位到指定行
        /// </summary>
        /// <param name="rowIndex">指定的從零開始的行的索引</param>
        public void GoToLine(int rowIndex)
        {
            txtBoxDocument.ScrollToLine(rowIndex);
        }
        
        /// <summary>
        /// 選中指定的行
        /// </summary>
        /// <param name="rowIndex">指定的從零開始的行的索引</param>
        public void SelectedLine(int rowIndex)
        {
            try
            {
                int lineLength = txtBoxDocument.GetLineLength(rowIndex);
                int start = txtBoxDocument.GetCharacterIndexFromLineIndex(rowIndex);
                
                txtBoxDocument.Focus();
                txtBoxDocument.Select(start, lineLength);
            }
            catch { }
        }

        然后,我們?cè)谡{(diào)用這兩個(gè)方法(假設(shè)我們使用一個(gè)Button調(diào)用,并在TextBox中指定要跳轉(zhuǎn)至的行),Button命名為:btnGoTo,該文本框命名為txtBoxLineNum

        private void btnGoTo_Click(object sender, RoutedEventArgs e)
        {
            int rowIndex = 0;
            if(int.TryParse(txtBoxLineNum.Text,rowIndex))
            {
                //先選擇,再跳轉(zhuǎn)至指定位置(這種使用方式?jīng)]問題)
                SelectedLine(rowIndex );
                GoToLine(rowIndex );
            }
        }

        如果將上面的調(diào)用方式改成下面情況,則會(huì)在SelectedLine(int rowIndex)方法的int lineLength = txtBoxDocument.GetLineLength(rowIndex);這句話出現(xiàn)問題,得出的lineLength不一定就是指定行的文本長(zhǎng)度了,有可能是負(fù)值。錯(cuò)誤的調(diào)用方式如下:

        private void btnGoTo_Click(object sender, RoutedEventArgs e)
        {
            int rowIndex = 0;
            if(int.TryParse(txtBoxLineNum.Text,rowIndex))
            {
                //先跳轉(zhuǎn)定位,再選擇(這種使用方式不穩(wěn)定)
                GoToLine(rowIndex );
                SelectedLine(rowIndex );
            }
        }

        如果將SelectedLine(int rowIndex)方法中的獲取指定行的文本長(zhǎng)度的方式改為先獲取其內(nèi)容,再計(jì)算長(zhǎng)度(int lineLength = txtBoxDocument.GetLineText(rowIndex).Length;),則經(jīng)常會(huì)報(bào)錯(cuò)。下面是改后的SelectedLine(int rowIndex):

        /// <summary>
        /// 選中指定的行
        /// </summary>
        /// <param name="rowIndex">指定的從零開始的行的索引</param>
        public void SelectedLine(int rowIndex)
        {
            try
            {
                //采用錯(cuò)誤的調(diào)用方式,下面這句話會(huì)報(bào)錯(cuò)(錯(cuò)誤信息如下面貼出的圖片所示)
                int lineLength = txtBoxDocument.GetLineText(rowIndex).Length;
                int start = txtBoxDocument.GetCharacterIndexFromLineIndex(rowIndex);
                
                txtBoxDocument.Focus();
                txtBoxDocument.Select(start, lineLength);
            }
            catch { }
        }

關(guān)于WPF中TextBox行的選擇與顯示的問題

        錯(cuò)誤內(nèi)容:當(dāng)前方法的代碼已經(jīng)過優(yōu)化,因此無法計(jì)算表達(dá)式的值。

        但是,采用正確的調(diào)用順序的方式不論是GetLineText(rowIndex).Length方式獲取指定行的文本長(zhǎng)度還是使用GetLineLength(rowIndex)方式獲取指定行的文本長(zhǎng)度,都是沒問題的。具體緣由尚不明確,也沒有查到相關(guān)的資料介紹。我自己的理解是在進(jìn)行ScrollToLine(rowIndex)操作之前,先選中指定行的文本,此時(shí),文本內(nèi)容沒有進(jìn)行滾動(dòng),是個(gè)靜止的狀態(tài),當(dāng)先進(jìn)行滾動(dòng)在去選中指定文本,文本內(nèi)容是個(gè)動(dòng)態(tài)滾動(dòng)的,可能此時(shí).NET運(yùn)行時(shí)需要做某些處理,因此,此時(shí)去獲取指定行的文本長(zhǎng)度或文本內(nèi)容則容易出現(xiàn)問題。另外,認(rèn)為文本內(nèi)容滾動(dòng)之后對(duì)于在可視范圍內(nèi)顯示的文本相對(duì)于文本框的上邊界的距離發(fā)生了變化,這也有可能是一個(gè)因素。不知道猜測(cè)是否正確,還希望各位大俠、專家給予指正,也好將其原理分享給其他程序員朋友。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI