добавление контента к нажатию кнопки в wpf - PullRequest
1 голос
/ 24 марта 2012

Почему я не могу сделать это в wpf?

    button1Click.Content = "Hover over me";

или

    ToolTip t = new ToolTip();
    t.Content = "Something helpful";
    button1Click.Tooltip = t;

Я заполняю свою вдову кнопками заполнения при инициализации. Затем у меня есть цикл foreach, который добавляет кнопки примерно так::

     foreach (var routedEventHandler in new RoutedEventHandler[] { button1Click, button2Click, button3_Click })`

Теперь в этой области я применяю стили к кнопкам «все в одном»:

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


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

                Button foo = new Button();



                Style buttonStyle = Window.Resources["CurvedButton"] as Style;
                int sizeValue = 100;

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

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


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

                foo.Click += routedEventHandler;

                LayoutRoot.Children.Add(foo);
            }
        }
    }
}

Но когда я пытаюсь это сделать:

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        ((Button)sender).ToolTip = t;
    }

Активируется только при нажатии кнопки?(Спасибо @HB)

Однако, когда я вставляю код всплывающей подсказки в мои заполненные кнопки:

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

            Button foo = new Button();
            ToolTip t = new ToolTip();
            t.Content = "Something helpful";
            foo.ToolTip = t;

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

Таким образом, чтобы подвести итог, я могу либо установить все кнопки с одинаковым сообщением всплывающей подсказки, либо содержимое кнопки внутри "populateButtons ()", или я могу установить только подсказкисодержание кнопки, когда кнопка была нажата.

Нет ли способа, позволяющего добавить контент к названной кнопке?

Как и моя первоначальная попытка:

button1Click.Content = "Home Button";

или

button1Click.ToolTip = "Hover over me";

С какой стати вы не можете установить содержимое и всплывающие подсказки для определенных кнопок при инициализации?

Ответы [ 3 ]

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

Если вы хотите пойти по этому маршруту, вы можете добавить обработчик для события Loaded:

foo.Click += routedEventHandler;
foo.Loaded += routedEventHandler;

И тогда у вас будет что-то вроде:

void button2Click(object sender, RoutedEventArgs e)
    {
        if (e.RoutedEvent == FrameworkElement.LoadedEvent)
        {
            ToolTip t = new ToolTip();
            t.Content = "Something helpful";
            ((Button)sender).ToolTip = t;
            return;
        }
        //Logic for handling button clicks goes here
        MessageBox.Show("action 2");
    }
1 голос
/ 24 марта 2012

Вы не назначаете всплывающую подсказку в обработчике, так что же должно произойти?

0 голосов
/ 24 марта 2012

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

Если это так, вы можете создавать разные классы, производные от Button(например, HelpfulButton, UnhelpfulButton ... выберите хорошие имена, пожалуйста :)) и в их конструкторе назначьте обработчик и всплывающую подсказку.

Затем в основном коде вы можете циклически проходить по разным классам и добавлять их экземпляры непосредственно на основной холст.

Другой возможный вариант - создавать различные кнопки-шаблоны с помощью команд.и скопировать свойства из них вместо подкласса Button.Как то так:

Button helpfulTemplate = new Button { ToolTip = "blah" };
helpfulTemplate.Command = HelpfulCommand;

Button unhelpfulTemplate = new Button { ToolTip = "bloh" };
unhelpfulTemplate.Command = UnhelpfulCommand;

foreach(var template in new Button[] {helpfulTemplate, unhelpfulTemplate})
{
     var newCopy = new Button();
     //etc.
     newCopy.ToolTip = template.ToolTip;
     newCopy.Command = template.Command;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...