Получить дочерние элементы шаблона элемента управления ContentControl?

Мы работаем над приложением Silverlight, которое использует общий настраиваемый ContentControl. Этот ContentControl имеет шаблон элемента управления, указанный в Generic.xaml.

Унаследованный шаблон ContentControl ...

<Style TargetType="local:ExtContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ExtContentControl">
                <Border x:Name="content" Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Child="{TemplateBinding Content}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Унаследованный шаблон ComboBox ...

<controltemplate targettype="local:ExtComboBox"></controltemplate>

...

<Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Margin="1" Opacity="0" RadiusY="2" RadiusX="2" Stroke="#FF6DBDD1" StrokeThickness="1"/>

Когда он создается, для содержимого ContentControl устанавливается (общий) элемент управления, который может быть текстовым полем, раскрывающимся списком, меткой или Datepicker.

public class ExtContentControl : ContentControl
{
    public ExtContentControl()
    {
        this.DefaultStyleKey = typeof(ExtContentControl);

        RenderControl();
    }

    private void RenderControl()
    {
        ExtComboBox extComboBox = new ExtComboBox();
        this.Content = extComboBox;
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        Border bor = GetTemplateChild("content") as Border;

        ExtComboBox cmbTest = bor.Child as ExtComboBox;

        //Find FocusVisualElement from ExtComboBox Control Template
        //Rectangle rec = cmbTest.FindName("FocusVisualElement") as Rectangle;
        //cmbTest returns null
    }
}

Как вы можете видеть в моем последнем комментарии ...

// Находим FocusVisualElement из шаблона элемента управления ExtComboBox // Прямоугольник rec = cmbTest.FindName ("FocusVisualElement") as Rectangle; // cmbTest возвращает null

Как я могу получить FocusVisualElement изнутри OnApplyTemplate внутри ContentControl?

Надеюсь, это имеет смысл.


person Ewert    schedule 06.05.2011    source источник
comment
Я бы унаследовал TextBox и добавил два свойства зависимости. Тогда получить необходимые значения не составит труда.   -  person vortexwolf    schedule 07.05.2011
comment
Аналогичный вопрос к этому ... stackoverflow.com/questions/4125641/   -  person Ewert    schedule 09.05.2011


Ответы (1)


Решение для этого ...

http://www.codeproject.com/Questions/192431/Hover-Foreground-Colour-with-dynamic-binding-Conte.aspx

person Ewert    schedule 10.05.2011
comment
Более простой способ сделать это - импортировать System.Windows.Controls.Primitives и использовать расширения VisualTreeHelper GetVisualDescendants или GetVisualAncestors! например: protected override OnApplyTemplate() { base.OnApplyTemplate(); Border bor = GetVisualDescendants().OfType<Border>().FirstOrDefault(x => (x as FrameworkElement).Name == "content"); }; - person Ewert; 27.03.2012