powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Тестовая альтернатива ContentControl
15 сообщений из 15, страница 1 из 1
Тестовая альтернатива ContentControl
    #36995227
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

WPF, .Net 3.5 SP1, MS VS 2010.

Написал такой пробный класс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Markup;
using System.ComponentModel;
using System.Windows.Controls;

namespace PropertiesAndMethods
{
  [DefaultProperty("MyContent"), ContentProperty("MyContent")]
  public class MyUIElement : Control
  {
    public static readonly DependencyProperty MyContentProperty;    
    /// <summary>
    /// Содержимое (строка), которое необходимо визуализировать
    /// </summary>
    [Bindable(true)]
    public string MyContent
    {
      get
      {
        return (string)base.GetValue(MyContentProperty);
      }
      set
      {
        base.SetValue(MyContentProperty, value);
      }
    }

    static MyUIElement()
    {
      FrameworkPropertyMetadata md = new FrameworkPropertyMetadata();
      md.AffectsArrange = true;
      md.AffectsMeasure = true;
      md.AffectsParentArrange = true;
      md.AffectsParentMeasure = true;
      md.CoerceValueCallback = CoerceValue;
      md.PropertyChangedCallback = PropChanged;
      md.AffectsRender = true;
      md.Inherits = true;
      md.DefaultValue = "sssss";
      MyContentProperty = DependencyProperty.Register("MyContent", typeof(string), typeof(MyUIElement), md, MyValidate);
    }

    private static object CoerceValue(DependencyObject d, object value)
    {
      if ((value == null) || ((string)value == string.Empty))
        return MyContentProperty.DefaultMetadata.DefaultValue;
      else
        return value;
    }

    private static bool MyValidate(object value)
    {
      return true;
    }


    private static void PropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      d.SetValue(MyContentProperty, "+++");
    }
  }
}



Тестирую его:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;

namespace PropertiesAndMethods
{
  public class Program
  {
    [STAThread]
    public static void Main()
    {
      Application app = new Application();
      Window win = new Window();

      MyUIElement me = new MyUIElement();
      me.MyContent = "wwwwww";
      me.Foreground = Brushes.Red;
      me.Background = Brushes.Green;
      me.FontSize = 12;
      me.HorizontalAlignment = HorizontalAlignment.Center;
      me.VerticalAlignment = VerticalAlignment.Center;
      me.Width = 80;
      me.Height = 40;

      //ContentControl me = new ContentControl();
      //me.Content = "wwwwww";
      //me.Foreground = Brushes.Red;
      //me.Background = Brushes.Green;
      //me.FontSize = 12;
      //me.HorizontalAlignment = HorizontalAlignment.Center;
      //me.VerticalAlignment = VerticalAlignment.Center;
      //me.Width = 80;
      //me.Height = 40;

      app.MainWindow = win;
      win.Content = me;
      win.Show();
      app.Run(win);
      //Console.Read();
    }
  }
}


Однако в окне не появляется текст. Если вместо MyUIElement использовать ContentControl (см. закомментированный блок кода) - надпись появляется.

Почему в приведённом выше коде, при использовании класса MyUIElement, текст не появляется в окне?
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996014
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

1) вам еще раз необходимо прочитать как объявлять DependencyProperty.
2) вы мешаете два состояния класса, выберите не статичный класс.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996017
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

3) если это визуальный контрол, создайте для него Template в который и поместите ContentControl, с которым потом и работайте.
4) почитайте как создавать свои CustomControl.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996053
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа1) вам еще раз необходимо прочитать как объявлять DependencyProperty.
Читал неоднократно. Если видите ошибку в объявлении свойства зависимости - прошу указать на неё.
уТКа2) вы мешаете два состояния класса, выберите не статичный класс.
Вообще-то мой класс итак не статический.
уТКа3) если это визуальный контрол, создайте для него Template в который и поместите ContentControl, с которым потом и работайте.
4) почитайте как создавать свои CustomControl.
Вы не поняли, я не собираюсь создавать полноценный пользовательский контрол. На примере своего класса я проверяю, можно ли создать аналог ContentControl. Это своего рода маленький эксперимент.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996615
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

авторЧитал неоднократно.
читайте еще раз и внимательно!
обратите внимание КАК вы объявляете DependencyProperty и как надо!
http://msdn.microsoft.com/en-us/library/ms752914.aspx

авторВообще-то мой класс итак не статический.
авторstatic MyUIElement(){...}
какого хрена тогда тут конструктор статический делает?

небрежное отношение порождает не работающую программу.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996686
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКаCompositum,

авторЧитал неоднократно.
читайте еще раз и внимательно!
обратите внимание КАК вы объявляете DependencyProperty и как надо!
http://msdn.microsoft.com/en-us/library/ms752914.aspx

авторВообще-то мой класс итак не статический.
авторstatic MyUIElement(){...}
какого хрена тогда тут конструктор статический делает?

небрежное отношение порождает не работающую программу.
У... Как у вас всё запущено, уважаемый... Так вы пытаетесь учить, не разбираясь в самой теме??? Это не есть гуд.
Итак, поехали:
уТКачитайте еще раз и внимательно!
обратите внимание КАК вы объявляете DependencyProperty и как надо!
http://msdn.microsoft.com/en-us/library/ms752914.aspx
авторВообще-то мой класс итак не статический.
авторstatic MyUIElement(){...}
какого хрена тогда тут конструктор статический делает?

небрежное отношение порождает не работающую программу.

Во первых - давайте без истерик... Договорились?
Во вторых, видимо сейчас я открою вам Америку - инициализировать свойство зависимости можно не только в момент объявления этого поля, но и в закрытом статическом конструкторе класса .
Откройте Мэтью-Макдональда , в книге о WPF 3.0, главу "Свойства зависимостей и маршрутизируемые события" - автор пишет об этом и даёт пример, в котором инициализация происходит именно в статическом конструкторе (стр 177).
Откройте Чарльза Петцольда "WPF базовый курс", главу "Зависимые свойства" на стр 155 - вас это удивит, но и он так же в своих примерах инициализирует свойства зависимости в статическом конструкторе.
Честно говоря, я как-то по умолчанию принимаю, что информация, которую дают указанные мною выше авторы, не подлежит сомнению (возможно вы на этот счёт имеете др. мнение)...

Т.о. прежде чем таким тоном "поучать", изучите сначала вопрос сами, дабы самому не сесть в лужу со своими интонациями/поучениями (без обид)...
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996690
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очепятка: "инициализировать" следует читать как "регистрировать".
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36996982
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

истерики нету, просто голые эмоции в тексте :)

по делу, я не WPF разработчик (поэтому читать выше указанные книги нету смысла), но Silverlight разработчик, в нем я ни разу не видел такого "странного" вида объявления зависимых пропертей, поэтому предпочитаю делать как написано в МСДН.

опыт владения более двух лет и имеются проекты (смотри ссылки в профиле) которые люди использую и при этом счастливы.

хотите упирайтесь дальше и спрашивайте на всех форумах "почему не работает", хотите сделайте как правильно.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997033
pfanera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКада нормально у него все объявлено, несколько занудно, разве что (разницы между непосредственной инициализацией public static readonly поля и инициализацией его же в статическом конструкторе нет никакой, это азы шарпа :) в итоге реально инициализация будет произведена именно в статическом конструкторе, а непосредственная инициализация при объявлении - просто синтаксический сахар шарпа).

По делу - не могу понять, почему автор ожидает от свойства MyContent такого же поведения, как у свойства Content класса ContentControl. Только потому, что класс помечен атрибутом ContentProperty? Сдается мне, что этого совершенно недостаточно и нужно, как уже советовал утка, поместить ContentPresenter в шаблон своего контрола, в OnApplyTemplate находить этот презентер, и совать в него то, что присвоено в MyProperty (соответственно, callback изменения свойства MyProperty должен учитывать тот факт, что может быть вызван ДО OnApplyTemplate, и корректно обрабатывать это).
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997040
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКая не WPF разработчик (поэтому читать выше указанные книги нету смысла), но Silverlight разработчик, в нем я ни разу не видел такого "странного" вида объявления зависимых пропертей, поэтому предпочитаю делать как написано в МСДН.

хотите упирайтесь дальше и спрашивайте на всех форумах "почему не работает", хотите сделайте как правильно.
MSDN :
ПримечаниеОпределение свойства зависимости в теле класса является обычной реализацией, но также возможно определить свойство зависимости в статическом конструкторе класса. Этот подход может пригодиться в том случае, если для инициализации свойства зависимостей понадобится несколько строк кода.

Как видите - мой вариант регистрации присутствует и в MSDN. В первом посте мною указано, что топик относится к WPF.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997049
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pfaneraСдается мне, что этого совершенно недостаточно и нужно, как уже советовал утка, поместить ContentPresenter в шаблон своего контрола, в OnApplyTemplate находить этот презентер, и совать в него то, что присвоено в MyProperty (соответственно, callback изменения свойства MyProperty должен учитывать тот факт, что может быть вызван ДО OnApplyTemplate, и корректно обрабатывать это).
Спасибо, попробую...
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997203
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
CompositumДобрый день.

WPF, .Net 3.5 SP1, MS VS 2010.

Написал такой пробный класс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Markup;
using System.ComponentModel;
using System.Windows.Controls;

namespace PropertiesAndMethods
{
  [DefaultProperty("MyContent"), ContentProperty("MyContent")]
  public class MyUIElement : Control
  {
    public static readonly DependencyProperty MyContentProperty;    
    /// <summary>
    /// Содержимое (строка), которое необходимо визуализировать
    /// </summary>
    [Bindable(true)]
    public string MyContent
    {
      get
      {
        return (string)base.GetValue(MyContentProperty);
      }
      set
      {
        base.SetValue(MyContentProperty, value);
      }
    }

    static MyUIElement()
    {
      FrameworkPropertyMetadata md = new FrameworkPropertyMetadata();
      md.AffectsArrange = true;
      md.AffectsMeasure = true;
      md.AffectsParentArrange = true;
      md.AffectsParentMeasure = true;
      md.CoerceValueCallback = CoerceValue;
      md.PropertyChangedCallback = PropChanged;
      md.AffectsRender = true;
      md.Inherits = true;
      md.DefaultValue = "sssss";
      MyContentProperty = DependencyProperty.Register("MyContent", typeof(string), typeof(MyUIElement), md, MyValidate);
    }

    private static object CoerceValue(DependencyObject d, object value)
    {
      if ((value == null) || ((string)value == string.Empty))
        return MyContentProperty.DefaultMetadata.DefaultValue;
      else
        return value;
    }

    private static bool MyValidate(object value)
    {
      return true;
    }


    private static void PropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      d.SetValue(MyContentProperty, "+++");
    }
  }
}



Тестирую его:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;

namespace PropertiesAndMethods
{
  public class Program
  {
    [STAThread]
    public static void Main()
    {
      Application app = new Application();
      Window win = new Window();

      MyUIElement me = new MyUIElement();
      me.MyContent = "wwwwww";
      me.Foreground = Brushes.Red;
      me.Background = Brushes.Green;
      me.FontSize = 12;
      me.HorizontalAlignment = HorizontalAlignment.Center;
      me.VerticalAlignment = VerticalAlignment.Center;
      me.Width = 80;
      me.Height = 40;

      //ContentControl me = new ContentControl();
      //me.Content = "wwwwww";
      //me.Foreground = Brushes.Red;
      //me.Background = Brushes.Green;
      //me.FontSize = 12;
      //me.HorizontalAlignment = HorizontalAlignment.Center;
      //me.VerticalAlignment = VerticalAlignment.Center;
      //me.Width = 80;
      //me.Height = 40;

      app.MainWindow = win;
      win.Content = me;
      win.Show();
      app.Run(win);
      //Console.Read();
    }
  }
}


Однако в окне не появляется текст. Если вместо MyUIElement использовать ContentControl (см. закомментированный блок кода) - надпись появляется.

Почему в приведённом выше коде, при использовании класса MyUIElement, текст не появляется в окне?
А с чего он должен появляться? Объявленно обычное свойство, присвоенно ему значение без всякой привязки к визуальному элементу, который должен выводить значение.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997207
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iА с чего он должен появляться? Объявленно обычное свойство, присвоенно ему значение без всякой привязки к визуальному элементу, который должен выводить значение.
Делал по аналогии с ContentControl, исходники коего смотрел через Reflector.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997768
pfanera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CompositumДелал по аналогии с ContentControl, исходники коего смотрел через Reflector.Не верю :) ContentControl имеет в своем шаблоне как раз таки ContentPresenter, а уж тот обучен выводить контент by design.
...
Рейтинг: 0 / 0
Тестовая альтернатива ContentControl
    #36997775
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pfaneraCompositumДелал по аналогии с ContentControl, исходники коего смотрел через Reflector.Не верю :) ContentControl имеет в своем шаблоне как раз таки ContentPresenter, а уж тот обучен выводить контент by design.
шаблон под MyUIElement я не делал.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Тестовая альтернатива ContentControl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]