Динамическая метка, созданная в событии OnDraw и редактируемая из Visual Studio Designer - PullRequest
2 голосов
/ 28 июня 2019

Что касается UserControl, как создать динамическое число (число из свойства, редактируемого из Visual Studio) меток, текст которых можно редактировать через окно Visual Studio «Дизайн»?

Редактировать Чтобы уточнить, я не хочу, чтобы пользователь изменял текст меток во время выполнения, вместо этого только разработчик, использующий элемент управления В их проекте можно изменять текст меток внутри Visual Studio Designer , просто щелкнув метку и изменив текст. (Не сам исходный код).

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

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

    public void CalledFromDrawMethod (string strElement, UserControl ucParentControl, Point pLoc)
    {
        var lblChild = new Label();
        lblChild.Text = strElement;
        lblChild.Location = pLoc;
        ucParentControl.Controls.Add(lblChild);// Add the label
    }

Ниже представлен пользовательский элемент управления в форме из окна «Дизайн» в Visual Studio. Одно изображение - это пользовательский элемент управления, когда нужно нарисовать 6 меток, а второе изображение - когда нужно нарисовать 3 метки. Опять же, это количество меток определяется общедоступным свойством в элементе управления

enter image description here enter image description here

В конкретной ситуации, изображенной на рисунках, я хотел бы иметь возможность щелкнуть одну из меток «DEFAULT» и изменить свойство метки «Text».

Версия Visual Studio: VS 2013 (я также пробовал с VS 15 и 17, но получил те же результаты) GUI Framework: Winforms

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Ответ на ваш вопрос заключается в невозможности достичь желаемого.

То, что вы хотите, просто невозможно в Visual Studio. Если это было возможно, то должен быть какой-то элемент управления .NET, который имеет такое поведение, но его нет. Хотя было бы неплохо, чтобы метки, созданные в событии OnDraw, вели себя так же, как если бы метка была помещена в форму в Designer, эту дополнительную поддержку пришлось бы добавить в Visual Studio. Как говорилось в предыдущем ответе, лучше всего обойти это, если иметь одну коллекцию, которая может изменять текст для этих меток в Visual Studio Designer.

1 голос
/ 28 июня 2019

Вот очень простой пример элемента управления с использованием пользовательского элемента управления.

public class ExampleCustomControl : Control
{
    public string Title { get; set; } = "";

    [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]
    public StringCollection SomeValues { get; set; } = new StringCollection();
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // grab the graphics object
        var g = e.Graphics;

        // draw the title property
        g.DrawString(Title, Font, Brushes.Blue, 0, 0);

        // will alter positions
        var y = 10;

        // for each value set in the properties
        foreach (var value in SomeValues)
        {
            // draw the property value
            g.DrawString(value, Font, Brushes.Red, 0, y);

            // move the position for the next text
            y += 10;
        }
    }
} 

Элемент управления имеет 2 свойства: Title и SomeValues. Если вы создаете приложение с этим, вы можете перетащить этот элемент управления на любые формы. Затем просто нажмите на элемент управления и проверьте сетку свойств, вы увидите как Title, так и SomeValues, которые вы можете редактировать там во время разработки. Очевидно, он просто обновляет информацию о перерисовке, поэтому просто переместите, растяните или закройте форму и снова откройте, чтобы отобразить ее.

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

0 голосов
/ 02 июля 2019

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

Пожалуйста, обратитесь к следующей статье для примера, поскольку это может стать сложной темой очень легко.

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/creating-a-wf-control-design-time-features

Также в stackoverflow есть еще один вопрос, который может вам помочь

Пользовательский конструктор для элемента управления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...