Наследование элемента управления Silverlight 3 не инициализирует содержимое - PullRequest
1 голос
/ 14 апреля 2010

У меня есть пользовательский элемент управления Silverlight с именем "BASE". У меня есть другой элемент управления, который наследуется от этого класса, "CHILD1". BASE имеет ContentPresenter, который содержит контент из элемента управления CHILD1. Мне нужен доступ к TextBox, который находится в содержимом элемента управления CHILD1, он инициализируется и отображается, но в коде он всегда равен нулю.

Есть ли способ получить доступ к этим элементам управления напрямую, вместо перебора дочерней коллекции свойства content?

Спасибо.

child1:

<local:BASE x:Class="CWTest1.CHILD1"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:local="clr-namespace:CWTest"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           Width="400"
           Height="300">
<Grid x:Name="LayoutRoot2"
      Background="White">
    <TextBox x:Name="tbx1"
             Text="xx" />
</Grid>

public partial class CHILD1 : BASE
{
    public CHILD1()
    {
        InitializeComponent();

        // this.tbx1 is always null
        this.tbx1.Focus();
    }
}

Часть BASE:

<ContentPresenter Grid.Row="1"
                      x:Name="cprContent"
                      Content="" />

Код базового класса: -

[ContentProperty("Content")]
public partial class cwBase1 : ChildWindow
...
new public object Content
    {
        get { return cprContent.Content; }
        set { cprContent.Content = value; }
    }

Ответы [ 2 ]

0 голосов
/ 15 апреля 2010

Я не думаю, что это должно быть так сложно, но вот работа, которую я получил, чтобы работать:

[ContentProperty("Content2")]
public partial class cwBase1 : ChildWindow
{
    ....
    public object Content2
    {
        get { return cprContent.Content; }
        set { cprContent.Content = value; }
    }
    ....
    protected T GetUIElement<T>(string name)
    {
        UIElement el = ((Grid)this.Content2).Children.FirstOrDefault(ui => 
            ui.GetType() == typeof(T) && 
            ui.GetType().GetProperty("Name").GetValue(ui, null).ToString() == name);

        return (T)(object)el;
    }
}




public partial class inherit2 : cwBase1
{
    public inherit2()
    {
        InitializeComponent();
        GetUIElement<TextBox>("tbx1").Focus();
    }
}

Мне все еще очень интересно услышать, что такое технически правильное решение.

0 голосов
/ 15 апреля 2010

Является ли TextBox все еще нулевым, если вы попытались сфокусировать его в переопределении OnApplyTemplate вместо конструктора?

public partial class CHILD1 : BASE
{
    public CHILD1()
    {
        InitializeComponent();
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        this.tbx1.Focus();
    }
}
...