Случайно назначенные кнопки - PullRequest
1 голос
/ 23 марта 2012

, поэтому этот код динамически добавляет кнопки в мое приложение Windows wpf. Я не могу придумать, каким образом я могу вызывать кнопки, которые на самом деле запускаются на сервере, потому что они добавляются случайным образом.

namespace DynamicButtons
{
    public partial class Window1
    {
        public Window1()
        {
            this.InitializeComponent();

            populateButtons();
        }

        public void populateButtons()
        {
            int xPos;
            int yPos;

            Random ranNum = new Random();

            for (int i = 0; i < 4; i++)
            {
                Button foo = new Button();
                Style buttonStyle = Window.Resources["CurvedButton"] as Style;

                int sizeValue = ranNum.Next(100);

                foo.Width = sizeValue;
                foo.Height = sizeValue;

                xPos = ranNum.Next(200);
                yPos = ranNum.Next(300);

                foo.HorizontalAlignment = HorizontalAlignment.Left;
                foo.VerticalAlignment = VerticalAlignment.Top;
                foo.Margin = new Thickness(xPos, yPos, 0, 0);

                foo.Style = buttonStyle;
                foo.Name = "button" + i;

                foo.Click += new RoutedEventHandler(buttonClick);

                LayoutRoot.Children.Add(foo);
           }
        }

        private void buttonClick(object sender, EventArgs e)
        {
            Button clicked = (Button) sender;
            // something like certainWindowsButton((i)<-this has to be based on above code) = clicked.Name(); 
            MessageBox.Show("Button's name is: " + clicked.Name);
        }
    }
}

Каждый раз, когда приложение запускается, кнопки назначаются случайным образом, и я хочу, чтобы я мог взаимодействовать с ними из кода.

So

foo.Name = "button" + i; 

означает, что при нажатии любой кнопки назначается номер, но как я могу взаимодействовать с этой кнопкой в ​​коде?

    private void buttonClick(object sender, EventArgs e)
    {
        Button clicked = (Button) sender;
        // something like certainWindowsButton((i)<-this has to be based on above code) = clicked.Name(); 
        MessageBox.Show("Button's name is: " + clicked.Name);
    }
}

Надеюсь, это имеет смысл.

Чтобы дать вам представление о том, что происходит на уровне проектирования:

enter image description here

Каждому из этих серых квадратов являются кнопки, каждой кнопке случайным образом назначается назначенное ей имя и номер, и при каждом запуске приложения этим кнопкам присваивается новый номер.

Мне нужен способ, которым, когда ему присваивается номер, я могу запустить событие для этой нажатой кнопки.

Так что случайным образом кнопке был присвоен номер 1, возьмите этот номер 1, а затем назначьте его

private void buttonClick(object sender, EventArgs e) 

if
{
    button1_Click = clicked.Name(strip away "button" and make sure the (variableNumber leftover matches button(1)_Click);
}
else 
    button2

и т. Д. И т. Д.

Который затем запускает событие моей кнопки:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("yay each randomly assigned button now correlates with a real button event");
        }
    }
}

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Если вы просто хотите выбрать действие на основе имени кнопки, может помочь приведенный ниже код. Очевидно, что вызовы метода doAction будут меняться, как и ваши случаи, но, надеюсь, код даст вам достаточно хорошую общую идею.

    private void buttonClick(object sender, EventArgs e)
    {
        Button clicked = (Button) sender;
        ChooseAction(clicked.Name);
    }

    private void ChooseAction(string buttonName)
    {
        switch(buttonName)
        {
            case "button1": doAction1(); break;
            case "button2": doAction2(); break;
            case "button3": doAction3(); break;
            case "button4": doAction4(); break;
            case "button5": doAction5(); break;
            default: doDefaultAction(); break;
        }
    }

    private void doAction1()
    {
        Console.WriteLine("action 1");
    }

    private void doAction2()
    {
        Console.WriteLine("action 2");
    }
    private void doAction3()
    {
        Console.WriteLine("action 3");
    }
    private void doAction4()
    {
        Console.WriteLine("action 4");
    }
    private void doAction5()
    {
        Console.WriteLine("action 5");
    }

    private void doDefaultAction()
    {
        Console.WriteLine("button name not recognised, performing default action");
    }
1 голос
/ 23 марта 2012

Это больше того, что вы ищете? Это берет каждый обработчик buttonNClick и создает для него кнопку. Таким образом, вам даже не нужно «я».

partial class Window1 {
    void button3Click(object sender, RoutedEventArgs e) {
        //Whatever you want here
    }
    void button2Click(object sender, RoutedEventArgs e) {
        //Whatever you want here
    }
    void button1Click(object sender, RoutedEventArgs e) {
        //Whatever you want here
    }

    public Window1() {
        this.InitializeComponent();
        populateButtons();
    }

    public void populateButtons() {
        int xPos;
        int yPos;

        Random ranNum = new Random();
        foreach (var routedEventHandler in new RoutedEventHandler[] { button1Click, button2Click, button3Click }) {
            Button foo = new Button();

            int sizeValue = ranNum.Next(100);

            foo.Width = sizeValue;
            foo.Height = sizeValue;

            xPos = ranNum.Next(200);
            yPos = ranNum.Next(300);

            foo.HorizontalAlignment = HorizontalAlignment.Left;
            foo.VerticalAlignment = VerticalAlignment.Top;
            foo.Margin = new Thickness(xPos, yPos, 0, 0);

            foo.Click += routedEventHandler;

            LayoutRoot.Children.Add(foo);
        }
    }
}
0 голосов
/ 23 марта 2012

Как сказал лобстеризм, или у вас может быть список команд, которые вы случайным образом привязываете к кнопкам, а не к какой-либо из них. http://www.switchonthecode.com/tutorials/wpf-tutorial-command-bindings-and-custom-commands

Вот подробный образец:

public class CoolCommand : ICommand
{
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
       //do what you want :)
    }

    #endregion
}

var allCommands = new List<ICommand>();
allCommands.Add(new CoolCommand);
allCommands.Add(new OtherCoolCommand);
allCommands.Add(new ThirdCoolCommand);

private void assignButton(button)
{
    var idx = new Random().nextInt(allCommands.Count-1);
    var command = allComands[idx];
    button.Command = command;
    allCommands.remove(command);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...