场景:
我想点击一个文本块并运行一个方法将该项目添加到购物车。
不,我不喜欢按钮而不是文本块,谢谢 :)
代码 (shoppingcart.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
namespace m_POS
{
    public class shoppingcart
    {
        int cartnum;
        int duplicate=0;
        int num_of_items;
        int counter=1;
        List<item> items = new List<item>();
        //constructor
        public shoppingcart()
        {
            this.cartnum = counter;
            counter += 1;
            this.num_of_items = 0;
            this.items = new List<item>();
            init_items();
        }
        //return the item list of tapped/purchased items
        public List<item> getitems(){
            return this.items;
        }
        //returns the number of items tapped/purchased
        public int get_num_of_items() { return this.num_of_items; }
        // the method that adds a tapped-on item to the items list
        public void additem(String itemx,String qty) {
            for (int i = 0; i < item.pick_item.Count; i++)
            {
                if (itemx.Equals(item.pick_item[i].getname()))
                {
                    item itm = new item(item.pick_item[i].getname(), 
                    item.pick_item[i].getprice());
                    itm.addqty(Convert.ToInt16(qty));
                    this.items.Add(itm);
                    Debug.WriteLine("added to cart!!");
                }
            }
                this.num_of_items += Convert.ToInt16(qty);
        }
//used to test the additem() works. Everytime the class is run, this Rolex item will
  //be the first to be added to the cart. ALWAYS. Funny thing is, it doesnt get
  // duplicated.
        private void init_items()
        {
            item itm12 = new item("Rolex", 4000);
            //additem(itm12);
            this.items.Add(itm12);
        }
    }
////////////////////////////////////////////////////////////////////////////////////////
    public class item
    {
        String itemname;
        int itemamount;
        int itemqty = 0;
        public static List<item> pick_item = new List<item>();
        public static List<String> menu_food = new List<string> {
        "Single Beef Burger",
           "Double Beef Burger",
           "Triple Beef Burger",
           "Single Chicken Burger",
           "Double Chicken Burger",
           "Single Veggie Burger",
           "1/2 Fries",
           "Full Fries",
           "Beef Steak",
            "Mushroom",
            "Steamed Rice",
            "Rolex"};
        public static List<String> menu_price = new List<String>{
            "8000",
            "17000",
            "25000",
            "12000",
            "26500",
            "7500",
            "4000",
            "6000",
            "20000",
            "25000",
            "17500",
            "4000"};
        public item(string name, int amount)
        {
            this.itemamount = amount;
            this.itemname = name;
            this.itemqty = 1;
        }
        public static void init_menu()
        {
            for (int i = 0; i < get_menu().Count; i++)
            {
                item itm = new item(menu_food[i], Convert.ToInt32(menu_price[i]));
                pick_item.Add(itm);
            }
        }
        public void addqty(int qty) { this.itemqty = qty; }
        public string getname() { return this.itemname; }
        public int getprice() { return this.itemamount; }
        public static int getpxbyname(string itemname) {
            int ans=0;
            for (int y = 0; y < pick_item.Count; y++) {
                if (pick_item[y].itemname.ToString().Equals(itemname)) {
                    ans = pick_item[y].itemamount;
                }
            }
            return ans;
        }
        public static List<String> get_menu() { return menu_food; }
        public static List<String> get_price() { return menu_price; }
    }
}
重复发生在哪里?
我得到 additem(string itemname,int itemqty)在每次点击时运行两次。不过,其他一切都很完美。
发帖前我做了什么?
- 测试了Tap事件并确保它每次点击只被触发一次?查看。
- 测试了该additem()方法以确保它可以使用?查看。每次启动应用程序时,我都会在购物车中添加一个项目。该项目永远不会被复制。
控制台 Debug.WriteLine() 显示
added to cart!!
added to cart!!
called method with System.Windows.Controls.TextBlock
前两个added to cart来自被调用两次的方法。
下一个来自我在从Food.xaml.cs [部分]called method with System.Windows.Controls.TextBlock调用此方法后插入的调试Food.xaml.cs
    public Foods()
    {
        InitializeComponent();
        item.init_menu();
        populatemenu();
    }
    public void populatemenu()
    {
        List<String> display = item.get_menu();
        for (int i = 0; i < display.Count; i++)
        {
            string tname = "tb" + i;
            TextBlock tb = new TextBlock();
            tb.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(tb_Click);
            tb.Style = (Style)Resources["textblocker"];
            tb.FontSize = 36;
            tb.Text = display[i];
            tb.Name = tname;
            sp_lunch.Children.Add(tb);
        }
    }
    private void tb_Click(object sender, RoutedEventArgs e)
    {
        tapped += 1;
        selectqty(sender);
    }
    private void selectqty(object sender) {
        Popup popup = new Popup();
        popup.Height = 300;
        popup.Width = 400;
        popup.VerticalOffset = 100;
        PopUpControl control = new PopUpControl();
        popup.Child = control;
        popup.IsOpen = true;
        string qty="";
        control.btnOK.Click += (s, args) =>
            {
                popup.IsOpen = false;
                //pick input from the popup's textbox.
                qty = control.tbx.Text;
                if (qty == null||qty=="") { qty = "0"; }
                //send clicked item to cart for addition
                TextBlock clicked = ((TextBlock)sender);
                string temp = clicked.Text;
                Cart.cart_new.additem(temp, qty);
                Debug.WriteLine("called method with "+sender.ToString());
                tb_pamount_lunch.Text = Convert.ToString(Cart.cart_new.get_num_of_items());
                //tb_pamount_lunch.Text = tapped.ToString();
                MessageBox.Show(temp);
                //update the dinner stackpanel to display the selected items
                sp_dinner.Children.Clear();
                List<item> display = Cart.cart_new.getitems();
                for (int i = 0; i < display.Count; i++)
                {
                    TextBlock tb1 = new TextBlock();
                    tb1.FontSize = 36;
                    tb1.Text = display[i].getname().ToString();
                    sp_dinner.Children.Add(tb1);
                }
            };
        control.btnCancel.Click += (s, args) =>
            {
                //close popup when cancel is clicked
                popup.IsOpen = false;
            };
    }
还有更多信息吗??
如果您还想看其他课程,我很乐意在此处复制/粘贴或上传整个 project.zip :)