none
Как добавить новое свойство для изображений в WPF? RRS feed

  • Вопрос

  • Microsoft Visual Studio 2010
    WPF C#

    Как добавить новое свойство для изображений в WPF?

    Вопрос по идее очень простой. Так. например, в Delphi - создать новый элемент управления на базе существующего. При зтом, что самое главное, новый элемент имеет в окне свойств и событий то же, что и существующий элемент, плюс пользовательские свойства и события.
    Не может быть такого, что в WPF C# нет такой возможности. Но нигде не нашел об этом ничего.
    Пожалуйста, напишите, как это сделать подробно или ссылку на него или ссылку, где это расписано, а еще лучше - скиньте рабочий элемент.
    PskNskVz@Narod.ru


    nikolaichIL

    23 марта 2013 г. 13:48

Ответы

  • Как делается в Делфи я уже не помню, ну а в C# можно сделать так:

    Если вы добавите следующий код в ваш контрол:

    static readonly DependencyProperty MyStringProperty = DependencyProperty.Register(
        "MyString", typeof(string), typeof(/* КЛАСС, В КОТОРОМ БУДЕТ ЭТО СВОЙСТВО */), new PropertyMetadata("Значение по умолчанию"));
    [Description("Описание поля MyString"), Category("Категория поля MyString")]
    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

    то при добавлении вашего элемента куда-нибудь (форма, юзер контрол и т.д.), в Свойствах этого контрола, появиться вкладка "Категория поля MyString", в котором будет поле "MyString" принимающее строковые данные. Такой же способ можно использовать для добавления собственных событий.

    P.S. В месте, где стоит "typeof(/* КЛАСС, В КОТОРОМ БУДЕТ ЭТО СВОЙСТВО */)", необходимо указать ваш контрол. Т.е. если вы создали новый UserControl и обозвали его "MySuperControl", то эта строка будет выглядеть так:

    ..., typeof(MySuperControl), ...

    P.S. #2 Надо подключить сборку "using System.ComponentModel;".

    25 марта 2013 г. 6:31
  • Тогда еще проще... Просто создать класс унаследованный от Image:

    public class ImageControl1 : Image
        {
            [DisplayName("SomeProperty")]
            [CategoryAttribute("SomeCategory")]
            [DescriptionAttribute("SomeDescription")]
            public String SomeProperty { get; set; }
        }
    23 марта 2013 г. 18:42
  • Привет,

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

    Спасибо 

    • Помечено в качестве ответа nikolaichIL 27 марта 2013 г. 1:23
    26 марта 2013 г. 15:05
    Модератор
  • Спасибо всем !!!

    Вы мне пчень помогли.


    nikolaichIL

    • Помечено в качестве ответа nikolaichIL 27 марта 2013 г. 1:28
    27 марта 2013 г. 1:28

Все ответы

  • В проект добавляете новый User Control (WPF), затем открываете .cs файл элемента управления и редактируете его так:

        /// <summary>
        /// Interaction logic for UserControl1.xaml
        /// </summary>
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
            [DisplayName("SomeProperty")]
            [CategoryAttribute("SomeCategory")]
            [DescriptionAttribute("SomeDescription")]
            public String SomeProperty { get; set; }
        }

    То есть к свойству нужно добавить несколько атрибутов (с говорящим названием). После чего собираете проект и в Toolbox появится ваш User Control.


    23 марта 2013 г. 16:40
  • Кирилл я так понял что вопрос о собственном контроле, унаследованном от Image. Напишите пожалуйста C# код с учетом наследования от Image.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    23 марта 2013 г. 18:34
    Отвечающий
  • Тогда еще проще... Просто создать класс унаследованный от Image:

    public class ImageControl1 : Image
        {
            [DisplayName("SomeProperty")]
            [CategoryAttribute("SomeCategory")]
            [DescriptionAttribute("SomeDescription")]
            public String SomeProperty { get; set; }
        }
    23 марта 2013 г. 18:42
  • User Control получается, а мне надо конкректно Image.

    И как в случае с Image должен выглядеть файл generic ?


    nikolaichIL

    23 марта 2013 г. 22:02
  • И как в случае с Image должен выглядеть файл generic ?



    nikolaichIL

    23 марта 2013 г. 22:03
  • В смысле Generic.xaml? Или что?
    23 марта 2013 г. 22:31
  • В смысле Generic.xaml? Или что?

    файл generic находящийся в папке themes при создании проекта с UserControl.

    nikolaichIL

    24 марта 2013 г. 6:20
  • файл generic находящийся в папке themes при создании проекта с UserControl.

    nikolaichIL

    Этот файл используется для создания шаблонов элементов управления. Если вас интересует наследование, то вам не нужен UserControl. Просто создайте новый класс и унаследуйте от Image как показал Кирилл. Ну и да, в любом случае требуется добавление нового класса. Расширить стандартный Image не получится.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    24 марта 2013 г. 6:33
    Отвечающий
  • Как делается в Делфи я уже не помню, ну а в C# можно сделать так:

    Если вы добавите следующий код в ваш контрол:

    static readonly DependencyProperty MyStringProperty = DependencyProperty.Register(
        "MyString", typeof(string), typeof(/* КЛАСС, В КОТОРОМ БУДЕТ ЭТО СВОЙСТВО */), new PropertyMetadata("Значение по умолчанию"));
    [Description("Описание поля MyString"), Category("Категория поля MyString")]
    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

    то при добавлении вашего элемента куда-нибудь (форма, юзер контрол и т.д.), в Свойствах этого контрола, появиться вкладка "Категория поля MyString", в котором будет поле "MyString" принимающее строковые данные. Такой же способ можно использовать для добавления собственных событий.

    P.S. В месте, где стоит "typeof(/* КЛАСС, В КОТОРОМ БУДЕТ ЭТО СВОЙСТВО */)", необходимо указать ваш контрол. Т.е. если вы создали новый UserControl и обозвали его "MySuperControl", то эта строка будет выглядеть так:

    ..., typeof(MySuperControl), ...

    P.S. #2 Надо подключить сборку "using System.ComponentModel;".

    25 марта 2013 г. 6:31
  • Олег не спешите предлагать свой ответ как правильный. Во-первых вероятность того, что ответ правильный выше, ели его таковым выберет другой участник, а не вы. Во-вторых тем самым вы снижаете интерес других участников к теме, так как они считают вопрос решенным и в тему не заходят. Позвольте назначать ваш ответ правильным другим участниками или автору вопроса.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    25 марта 2013 г. 7:22
    Отвечающий
  • Привет,

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

    Спасибо 

    • Помечено в качестве ответа nikolaichIL 27 марта 2013 г. 1:23
    26 марта 2013 г. 15:05
    Модератор
  • Спасибо всем !!!

    Вы мне пчень помогли.


    nikolaichIL

    • Помечено в качестве ответа nikolaichIL 27 марта 2013 г. 1:28
    27 марта 2013 г. 1:28