Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Тестовая альтернатива ContentControl / 15 сообщений из 15, страница 1 из 1
04.12.2010, 18:31
    #36995227
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
Добрый день.

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
05.12.2010, 20:00
    #36996014
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
Compositum,

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

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

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

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

небрежное отношение порождает не работающую программу.
...
Рейтинг: 0 / 0
06.12.2010, 11:23
    #36996686
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
уТКа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
06.12.2010, 11:24
    #36996690
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
очепятка: "инициализировать" следует читать как "регистрировать".
...
Рейтинг: 0 / 0
06.12.2010, 13:04
    #36996982
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
Compositum,

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

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

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

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

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

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

Как видите - мой вариант регистрации присутствует и в MSDN. В первом посте мною указано, что топик относится к WPF.
...
Рейтинг: 0 / 0
06.12.2010, 13:26
    #36997049
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
pfaneraСдается мне, что этого совершенно недостаточно и нужно, как уже советовал утка, поместить ContentPresenter в шаблон своего контрола, в OnApplyTemplate находить этот презентер, и совать в него то, что присвоено в MyProperty (соответственно, callback изменения свойства MyProperty должен учитывать тот факт, что может быть вызван ДО OnApplyTemplate, и корректно обрабатывать это).
Спасибо, попробую...
...
Рейтинг: 0 / 0
06.12.2010, 14:17
    #36997203
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
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
06.12.2010, 14:18
    #36997207
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
iА с чего он должен появляться? Объявленно обычное свойство, присвоенно ему значение без всякой привязки к визуальному элементу, который должен выводить значение.
Делал по аналогии с ContentControl, исходники коего смотрел через Reflector.
...
Рейтинг: 0 / 0
06.12.2010, 17:24
    #36997768
pfanera
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
CompositumДелал по аналогии с ContentControl, исходники коего смотрел через Reflector.Не верю :) ContentControl имеет в своем шаблоне как раз таки ContentPresenter, а уж тот обучен выводить контент by design.
...
Рейтинг: 0 / 0
06.12.2010, 17:26
    #36997775
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тестовая альтернатива ContentControl
pfaneraCompositumДелал по аналогии с ContentControl, исходники коего смотрел через Reflector.Не верю :) ContentControl имеет в своем шаблоне как раз таки ContentPresenter, а уж тот обучен выводить контент by design.
шаблон под MyUIElement я не делал.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Тестовая альтернатива ContentControl / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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