C#仅将几个按钮用于许多不同的方法?

时间:2018-07-14 01:33:11

标签: c# button

我试图用C#制作“选择自己的冒险游戏”,但按钮有问题。我有6个按钮,我想将它们重用于故事的每个“页面”上的不同选项。 Program Window

作为示例,我将其用于btn1。

void page1(){
txtStory.Text = "Can you sneak past the enemy?";
    btn1.Click += (sender, args) => {
        luckCheck();
        if (lucky) {page2(); clearButtons();}
        else {page3(); clearButtons();}
    };
}

    void luckCheck(){
        int luckTest = gen.Next(1,12);
        if (luckTest <= playerLuck) {lucky = true;}
        else {lucky = false;}
    }

    void clearButtons(){
    btnN.Text = "";
    btnS.Text = "";
    btnE.Text = "";
    btnW.Text = "";
    btn1.Text = "";
    btn2.Text = "";
    btn3.Text = "";
    btn4.Text = "";
    btn5.Text = "";
    btn6.Text = "";
    }

void page2(){
txtStory.Text = "Lucky!";
}

void page3(){
txtStory.Text = "Not Lucky!";
}

即使已转到另一种方法,如果单击btn1,它仍然会从page1重复相同的命令。有没有办法阻止这种情况的发生?就像清除按钮或其他东西的内存一样。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是 implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.+' 附加了一个永远不会分离的匿名处理程序方法,因此,每次调用它时,您只会添加越来越多的处理程序。

但是,一旦您开始添加大量页面,该设计将很快消失。

请考虑另一种设计,其中有一个 startCameraAndOptions(); //call to starts you camera with other additional option like gallery. public void startCameraAndOptions(View view) { CropImage.activity() .setGuidelines(CropImageView.Guidelines.ON) .setActivityTitle("My Crop") .setCropShape(CropImageView.CropShape.RECTANGLE) .setCropMenuCropButtonTitle("Done") // .setRequestedSize(400, 400) .setAllowRotation(true) .setOutputCompressQuality(100) .setCropMenuCropButtonIcon(R.drawable.arrow) .start(this); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { BitmapDrawable background; Bitmap bitmap; ImageView img_preview = (ImageView) findViewById(R.id.img_preview); // handle result of CropImageActivity if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { CropImage.ActivityResult result = CropImage.getActivityResult(data); if (resultCode == RESULT_OK) { bitmap = null; try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), result.getUri()); background = new BitmapDrawable(bitmap); } catch (IOException e) { e.printStackTrace(); } Picasso.get() .load(result.getOriginalUri()) // .resize(200, 200) // .centerCrop() .into(img_preview); } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { Toast.makeText(this, "Cropping failed: " + result.getError(), Toast.LENGTH_LONG).show(); } } } **/* LAYOUT SECTION */ optional (style it your own way)** <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.hollaport.hollaport.Demo"> <Button android:layout_marginTop="10dp" android:layout_gravity="center" android:id="@+id/trigger" android:layout_width="50dp" android:layout_height="50dp" android:background="@drawable/camera"/> <!--<com.theartofdev.edmodo.cropper.CropImageView--> <!--android:id="@+id/cropImageView"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="0dp"--> <!--android:layout_weight="1"/>--> <android.support.v7.widget.CardView android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:layout_gravity="center" android:adjustViewBounds="true" android:innerRadius="0dp" android:shape="rectangle" android:thicknessRatio="2" app:cardCornerRadius="0dp"> <ImageView android:id="@+id/img_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:adjustViewBounds="true" android:scaleType="fitXY"/> </android.support.v7.widget.CardView> </LinearLayout> 类来表示每个页面。该类将故事作为属性,并包含可能的page1()(而不是对其中的6个进行硬编码)的集合。 Page是一个具有Choice字符串属性和一个Choice方法的类,如果使用它将被执行。

您的应用程序可以拥有CurrentPage属性,并且您的“选择操作”将需要能够通过更改该页面进行导航。等等...

希望这会有所帮助。

P.S。额外的小费。与其在类字段上返回Description方法的结果,不如考虑对其进行重新设计以返回结果:

Action

答案 1 :(得分:1)

这里没有详细说明如何更好地构造上面的代码,下面是使用C#7的解决方案。请注意,如何使用Delegate Type Inference

分配一个本地函数来处理然后未分配的事件
void page1(){
    txtStory.Text = "Can you sneak past the enemy?";

    void Btn1Click(object s, EventArgs ev)
    {
        luckCheck();
        if (lucky) {page2(); clearButtons(); btn1.Click -= Btn1Click; }
        else {page3(); clearButtons();}
    };

    btn1.Click += Btn1Click;

    void luckCheck(){
    int luckTest = gen.Next(1,12);
    if (luckTest <= playerLuck) {lucky = true;}
    else {lucky = false;}
    }

    void clearButtons(){
    btnN.Text = "";
    btnS.Text = "";
    btnE.Text = "";
    btnW.Text = "";
    btn1.Text = "";
    btn2.Text = "";
    btn3.Text = "";
    btn4.Text = "";
    btn5.Text = "";
    btn6.Text = "";
    }

    void page2(){
    txtStory.Text = "Lucky!";
    }

    void page3(){
    txtStory.Text = "Not Lucky!";
    }