获取ContentControl控件的模板子元素?

4
我们正在开发一个使用通用自定义ContentControl的Silverlight应用程序。这个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被实例化时,它的内容被设置为一个(通用的)控件,可以是文本框、下拉列表、标签或日期选择器。
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
    }
}

正如您在上一条评论中所看到的...

//从ExtComboBox控件模板中查找FocusVisualElement //Rectangle rec = cmbTest.FindName("FocusVisualElement") as Rectangle; //cmbTest返回null

我该如何在ContentControl内部的OnApplyTemplate中获取FocusVisualElement?

希望这样说得通。


我会继承TextBox并添加两个依赖属性。这样就不难检索必要的值了。 - vortexwolf
类似于这个问题...http://stackoverflow.com/questions/4125641/get-nested-control-located-in-controltemplate-in-code-behind - Ewert
1个回答

1

1
一个更容易的方法是导入 System.Windows.Controls.Primitives 并使用 VisualTreeHelper 扩展 GetVisualDescendants 或 GetVisualAncestors!例如:protected override OnApplyTemplate() { base.OnApplyTemplate(); Border bor = GetVisualDescendants().OfType<Border>().FirstOrDefault(x => (x as FrameworkElement).Name == "content"); }; - Ewert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接