【问题标题】:rich text box in WPF. Find or select text already in box?WPF 中的富文本框。查找或选择框中已有的文本?
【发布时间】:2017-01-03 13:07:14
【问题描述】:

编辑:在帖子末尾包含我的整个程序代码

我正在做一个交易或不交易的游戏,除了消除猜测的两边的数字外,我一切正常。希望有人可以指导我...

Here is what my GUI looks like

GUI after first round. Box 1 is "my" box, bolded boxes are ones I've already opened

我有一个 WPF,里面有 2 个富文本框。我有一组数字,我将一半放在一个文本框中,一半放在另一个文本框中。我将值显示为货币以符合游戏的主题。

这是我的数组代码并显示在文本框中:

//initialize array with dollar values
        displayNumbers = new int[] {0, 1, 5, 10, 25, 50, 75, 100, 200, 300, 400, 500, 750,
            1000, 5000, 10000, 25000, 50000, 75000, 100000, 200000, 300000, 400000, 500000, 750000, 1000000};

        //initialize usedNumbers array with a length
        usedNumbers = new int[displayNumbers.Length];

        //display amounts in 1st textblock. boxSize = 26 (size of array)
        for(int i = 0; i<(boxSize/2); i++)
        {
            textBox1.AppendText(displayNumbers[i].ToString("C0") + " \n");
        }

        //display amounts in 2nd textblock
        for(int i = boxSize/2; i < boxSize; i++)
        {
            textBox2.AppendText(displayNumbers[i].ToString("C0") + "\n");
        }

我的游戏目前的工作方式是,数组随机播放,无论您接下来按什么按钮,该值都将是数组中的下一个随机值。在洗牌之前,我会在两侧显示这些值。

如何获取数组中索引的当前值并在富文本框中找到该数字并更改颜色或背景等,以便用户知道该值不在板上?

我已经在使用按钮的内容来显示与该按钮关联的值,但我还应该从边框中删除该值。

根据我在网上找到的内容,我认为指针可能是我的答案?但我还不知道如何使用它们......

我还是个初学者,所以如果能用初学者的方式回答,我真的很感激。

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 DealorNoDeal
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int[] displayNumbers;
        int[] usedNumbers;
        Random random = new Random();
        int boxSize = 26;
        Button button;
        int turns = 0;
        int boxesToChoose;
        int boxesLeft = 26;
        int bankOffer;
        bool isOffer = false;
        bool deal = false;
        private Button firstChoice;
        int round = 0;

        public MainWindow()
        {
            InitializeComponent();

            //initialize array with dollar values
            displayNumbers = new int[] {0, 1, 5, 10, 25, 50, 75, 100, 200, 300, 400, 500, 750,
                1000, 5000, 10000, 25000, 50000, 75000, 100000, 200000, 300000, 400000, 500000, 750000, 1000000};

            //initialize usedNumbers array with a length
            usedNumbers = new int[displayNumbers.Length];

            //display amounts in 1st textblock
            for(int i = 0; i<(boxSize/2); i++)
            {
                textBox1.AppendText(displayNumbers[i].ToString("C0") + " \n");
            }

            //display amounts in 2nd textblock
            for(int i = boxSize/2; i < boxSize; i++)
            {
                textBox2.AppendText(displayNumbers[i].ToString("C0") + "\n");
            }

            //deal/nodeal buttons disabled on startup only enabled when deal is offered
            buttonDeal.IsEnabled = false;
            buttonNoDeal.IsEnabled = false;

            //randomize dollar values for boxes now that they have been displayed in order
            ShuffleDecks();
        }

        private void ShuffleDecks()
        {
            //fisher-yates shuffle algorithm
            int index;
            string temp;

            for (int i = 0; i < boxSize; i++)
            {
                index = random.Next(boxSize);
                temp = Convert.ToString(displayNumbers[i]);
                displayNumbers[i] = displayNumbers[index];
                displayNumbers[index] = Convert.ToInt32(temp);
            }
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            button = sender as Button;
            if (deal == true)
            {
                if (bankOffer > displayNumbers[0])
                {
                    textBlockDisplay.Text = "You made a good deal! Your winnings: " + bankOffer.ToString("C0");
                }
                else
                {
                    textBlockDisplay.Text = "Better luck next time! Your winnings: " + bankOffer.ToString("C0");
                }

                firstChoice.Content = displayNumbers[0].ToString("C0");
                firstChoice.IsEnabled = false;
            }

            else
            {
                if (isOffer == false)
                {
                    //first turn is to pick a box, not opening a box
                    if (turns == 0)
                    {
                        button.IsEnabled = false;
                        firstChoice = button;
                        boxesToChoose = BoxesToOpen();
                        textBlockDisplay.Text = "Now choose " + boxesToChoose + " box(es)";
                    }

                    //opening boxes
                    else
                    {
                        button.FontWeight = FontWeights.Bold;
                        button.Content = displayNumbers[turns].ToString("C0");
                        usedNumbers[turns] = displayNumbers[turns];
                        boxesToChoose--;
                        textBlockDisplay.Text = "Now choose " + boxesToChoose + " box(es)";
                        //FindText(textBox1,Convert.ToString(button.Content),Brushes.Red);
                    }
                    boxesLeft--;
                    CheckTurns();
                    turns++;
                }
            }
        }

        //see what turn we are on and make an offer
        private void CheckTurns()
        {
            if(turns == 6 || turns == 11 || turns == 15 || turns == 18 || turns == 20 || turns == 21 || turns == 22 || turns == 23 || turns == 24 || turns == 25)
            {
                //enable deal/nodeal buttons
                buttonDeal.IsEnabled = true;
                buttonNoDeal.IsEnabled = true;

                isOffer = true; //disable the other boxes you haven't opened yet

                //calculate the offer
                bankOffer = CalculateOffer(boxesLeft);

                textBlockDisplay.Text = "The bank offers you: " + bankOffer.ToString("C0") +" Deal?";
                round++;
            }
        }

        private void buttonDeal_Click(object sender, RoutedEventArgs e)
        {
            if (turns < 25)

            {
                deal = true;
                GreyAllBoxes();
                firstChoice.IsEnabled = true;
                textBlockDisplay.Text = "Game Over! You walk away with " + bankOffer.ToString("C0") + " Click your first box to see if you made a good deal.";
            }
            else
            {
                textBlockDisplay.Text = "Game Over! You walk away with " + bankOffer.ToString("C0") + " Click your first box to see if you made a good deal.";
            }
        }

        private void buttonNoDeal_Click(object sender, RoutedEventArgs e)
        {
            if (turns < 25)
            {
                isOffer = false;
                boxesToChoose = BoxesToOpen();
                textBlockDisplay.Text = "Now choose " + boxesToChoose + " box(es)";
            }
            else
            {
                //stick with first box or take last box
                textBlockDisplay.Text = "Do you choose your 1st box, or " + bankOffer.ToString("C0") + "?";

                buttonDeal.Content = bankOffer.ToString("C0");
                buttonNoDeal.IsEnabled = false;

                firstChoice.IsEnabled = true;
            }
        }

        private int CalculateOffer(int boxes)
        {
            int offer;
            int mainSum = displayNumbers.Sum();
            int usedSum = usedNumbers.Sum();

            //offer = sum of boxes left, divided by number of boxes left
            offer = (mainSum - usedSum)/boxes;

            return offer;
        }

        private void GreyAllBoxes()
        {
            buttonDeal.IsEnabled = false;
            buttonNoDeal.IsEnabled = false;
            button1.IsEnabled = false;
            button2.IsEnabled = false;
            button3.IsEnabled = false;
            button4.IsEnabled = false;
            button5.IsEnabled = false;
            button6.IsEnabled = false;
            button7.IsEnabled = false;
            button8.IsEnabled = false;
            button9.IsEnabled = false;
            button10.IsEnabled = false;
            button11.IsEnabled = false;
            button12.IsEnabled = false;
            button13.IsEnabled = false;
            button14.IsEnabled = false;
            button15.IsEnabled = false;
            button16.IsEnabled = false;
            button17.IsEnabled = false;
            button18.IsEnabled = false;
            button19.IsEnabled = false;
            button20.IsEnabled = false;
            button21.IsEnabled = false;
            button22.IsEnabled = false;
            button23.IsEnabled = false;
            button24.IsEnabled = false;
            button25.IsEnabled = false;
            button26.IsEnabled = false;
        }

        private void UnGreyAllBoxes()
        {
            button1.IsEnabled = true;
            button2.IsEnabled = true;
            button3.IsEnabled = true;
            button4.IsEnabled = true;
            button5.IsEnabled = true;
            button6.IsEnabled = true;
            button7.IsEnabled = true;
            button8.IsEnabled = true;
            button9.IsEnabled = true;
            button10.IsEnabled = true;
            button11.IsEnabled = true;
            button12.IsEnabled = true;
            button13.IsEnabled = true;
            button14.IsEnabled = true;
            button15.IsEnabled = true;
            button16.IsEnabled = true;
            button17.IsEnabled = true;
            button18.IsEnabled = true;
            button19.IsEnabled = true;
            button20.IsEnabled = true;
            button21.IsEnabled = true;
            button22.IsEnabled = true;
            button23.IsEnabled = true;
            button24.IsEnabled = true;
            button25.IsEnabled = true;
            button26.IsEnabled = true;
        }

        private int BoxesToOpen()
        {
            if (round == 0)
            {
                boxesToChoose = 6;
            }
            else if(round == 1)
            {
                boxesToChoose = 5;
            }
            else if (round == 2)
            {
                boxesToChoose = 4;
            }
            else if (round == 3)
            {
                boxesToChoose = 3;
            }
            else if(round == 4)
            {
                boxesToChoose = 2;
            }
            else
            {
                boxesToChoose = 1;
            }

            return boxesToChoose;
        }
    }

【问题讨论】:

  • 你能说出你想从富文本框中提取什么吗?那个数字是 143,066 还是别的什么??
  • 这是我数组中的值之一。它们是随机的,所以我不知道它会是什么数字。基本上无论 displayNumbers[i] 当前是什么。
  • 显示您尝试提取值的代码?
  • 这基本上是我想要做的,但这是来自表单的代码,而不是 WPF。显然richTextBoxes 在WPF 中没有.Find 选项? *抱歉,无法确定 cmets 中的代码显示... private void ShowAmountsUsed() { for (int i = 0; i

标签: c#


【解决方案1】:

回答您的问题需要多个代码块。由于你没有展示太多的部分,我只是在指导你完成任务的建议和参考。

  1. 不需要跟踪索引,因为按钮具有数量,即您需要在 Richtextbox 中搜索和处理的文本。

  2. 从文本框中删除所选金额

    一个。单击按钮时,首先在富文本框中搜索金额"$" + searchAmount + " \n"。请参阅link1link2 的解决方案。一个接一个地搜索文本框。如果在第一个找到,则无需在第二个文本框中搜索。

    b.选择搜索到的数量并进行装饰。

    c。我的建议是用 StrikeThrough 装饰它,而不是从文本框中删除它。您也可以突出显示红色。删除所选文本很简单,使用textBox1.SelectedText = "";。红色突出显示可以使用textBox1.SelectionColor = Color.Red; 完成。对于删除线,您必须使用 TextRangeTextDecorationCollection。参考link3

【讨论】:

  • 是否有一个库需要包含在 WPF 中以用于 .Find 方法?当我尝试键入“textBox1.Find”时,我总是会收到错误消息,因为它不是智能感知给我的选项之一。它似乎只包含在表格中。你给我的link1中的例子正是我想做的。
  • 您必须编写自己的函数才能在文本框文本中查找按钮文本。请参阅stackoverflow.com/questions/22229741/…。看看它是怎么做的。
猜你喜欢
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多