Принудительно выполнить OnApplyTemplate для выполнения - PullRequest
1 голос
/ 13 мая 2011

Я пытаюсь динамически добавить кнопку в WrapPanel, который находится внутри Grid, но ссылка WrapPanel ( _innerPanel свойство ) недействительна, пока не будет вызван OnApplyTemplate.

Здесьтакое XMAL:

<s:MyGrid>
    <WrapPanel x:Name="PART_InnerPanel">

    </WrapPanel>
</s:MyGrid>

Класс MyGrid:

public class MyGrid: Grid
{
    WrapPanel _innerPanel;

    public WrapPanel Panel
    {
      get{return _innerPanel;}
    }

    static MyGrid()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyGrid), new FrameworkPropertyMetadata(typeof(MyGrid)));
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _innerPanel = Template.FindName("PART_InnerPanel", this) as WrapPanel;
        if (_innerPanel == null)
          throw new ResourceReferenceKeyNotFoundException("Invalid template");
    }
 }

Внутри кода:

MyGrid g = new MyGrid();
g.ApplyTemplate(); // <-- doesn't do anything
g.UpdateLayout(); // <-- doesn't do anything
if(g.Panel != null) // <-- it's NULL here as OnApplyTemplate hasn't get called
{
   g.Panel.Children.Add(new Button());
}

Как получить ссылку на WrapPanel, определенную в XAMLсразу после строки

MyGrid g = new MyGrid();

Или какой-нибудь обходной путь или лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011

Решение, которое я использую, состоит в том, чтобы установить _innerPanel в переопределении OnApplyTemplate (как вы делаете) и всегда проверять его на ноль, когда я хочу его использовать.

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

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

Так что я думаю, что вы не можете иметь то, что вы просите.

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