2011-05-06 73 views
4

我們正在研究使用通用自定義ContentControl的Silverlight應用程序。這個ContentControl有一個在Generic.xaml中指定的控制模板。獲取ContentControl控件的模板子項?

繼承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> 

繼承的組合框的模板...

<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 //矩形REC = cmbTest.FindName( 「FocusVisualElement」)爲矩形; // cmbTest返回null

如何從ContentControl中的OnApplyTemplate中獲取FocusVisualElement?

希望這是有道理的。

+0

我會繼承文本框,並添加兩個依賴屬性。那麼檢索必要的值並不困難。 – vorrtex 2011-05-07 08:23:23

+0

對此類似的問題... http://stackoverflow.com/questions/4125641/get-nested-control-located-in-controltemplate-in-code-behind – Ewert 2011-05-09 15:40:33

回答

1
+1

一個更簡單的方法來做到這一點是導入系統.Windows.Controls.Primitives並使用VisualTreeHelper擴展GetVisualDescendants或GetVisualAncestors!例如: 例如: '''''''''''''''保護覆蓋OnApplyTemplate() { base.OnApplyTemplate(); Border bor = GetVisualDescendants()。OfType ().FirstOrDefault(x =>(x as FrameworkElement).Name ==「content」); };' – Ewert 2012-03-27 07:46:02

相關問題