Назначьте ресурс ContentControl унаследованному элементу ContentControl - PullRequest
0 голосов
/ 14 сентября 2011

У меня проблема, и мне нужна ваша помощь.Вот мой код:

public class CircleElement : ContentControl
{

public ContentControl me;
private FrameworkElement _parent;

public CircleElement()
{
  if (_parent != null)
  {
    me = (ContentControl)_parent.FindResource("CircleRes");
    me.Style = (Style)_parent.FindResource("CircleStyle");
  }

}

CircleElement наследует ContentControl, и я хотел бы назначить ему ресурс "CircleRes" и стиль "CircleStyle".Что-то вроде:

this = (ContentControl)_parent.FindResource("CircleRes");
this.Style = (Style)_parent.FindResource("CircleStyle");

Эта вещь недопустима. Чтобы обойти эту проблему, я создал элемент ContentControl me;но код немного грязный !!Как сделать его более «элегантным» ???

Заранее спасибо

Паоло

1 Ответ

0 голосов
/ 14 сентября 2011

Ваше требование немного странно, но оно выполнимо несколькими способами ...

Вместо того, чтобы иметь другой элемент управления контентом (например, me), почему бы не установить this Контент самого элемента управления?

    this.Content
           = (ContentControl)_parent.FindResource("CircleRes"); 
    ((ContentControl)(this.Content)).Style
           = (Style)_parent.FindResource("CircleStyle"); //*** Potential problem

Проблема : Постановка потенциальной проблемы помечена таким образом, потому что ваш код (и мой тоже) устанавливает стиль "CircleStyle" на "CircleRes" ресурс по ссылке.

Как?me или ((ContentControl)(this.Content)) - это не что иное, как ресурс "CircleRes"!

Это означает, что если "CircleRes" упоминается в каком-то другом месте, он будет нести "CircleStyle" как свой собственный стиль вместе с ним.И если вы установите новый Style на "CircleRes" где-то еще, то будет перезаписывать Style из "CircleRes" везде, где используется, включая приведенный выше код (где предполагаемый стиль "CircleStyle")

Решение : вместо этого используйте ContentTemplate.Шаблоны не вызывают визуальные ссылки по экземпляру.

Таким образом, на самом деле вы должны иметь DataTemplate (скажем, "CircleResTemplate") и установить его как ContentTemplate в класс CircleElement.

   this.ContentTemplate
       = (DataTemplate)_parent.FindResource("CircleResTemplate");
   this.Style
       = (Style)_parent.FindResource("CircleStyle"); 

Дайте мне знать, если это ответит на ваш вопрос.

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