2010-04-13 88 views
3

您好,這與How to access a named element of a derived user control in silverlight?類似,區別在於從模板化控件繼承,而不是用戶控件。如何訪問繼承自模板控件的控件中的指定元素

我有一個名爲MyBaseControl

的XAML模板控制: -

<Style TargetType="Problemo:MyBaseControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Problemo:MyBaseControl"> 
        <Grid x:Name="LayoutRoot" Background="White"> 
         <Border Name="HeaderControl" Background="Red" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

代碼: -

public class MyBaseControl : Control 
    { 
     public UIElement Header { get; set; } 

     public MyBaseControl() 
     { 
      DefaultStyleKey = typeof(MyBaseControl); 
     } 

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

      var headerControl = GetTemplateChild("HeaderControl") as Border; 

      if (headerControl != null) 
       headerControl.Child = Header; 

     } 
    } 

我有一個名爲myControl另一個控制從MyBaseControl控制

繼承Xaml: -

<me:MyBaseControl x:Class="Problemo.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:me="clr-namespace:Problemo" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <me:MyBaseControl.Header> 
     <TextBlock Name="xxx" /> 
    </me:MyBaseControl.Header> 
</me:MyBaseControl> 

代碼: -

public partial class MyControl : MyBaseControl 
{ 
    public string Text { get; set; } 

    public MyControl(string text) 
    { 
     InitializeComponent(); 
     Text = text; 
     Loaded += MyControl_Loaded; 
    } 

    void MyControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     base.ApplyTemplate(); 
     xxx.Text = Text; 
    } 
} 

問題是xxx是零。如何在後面的代碼中訪問xxx控件?

+0

是xxx甚至在OnApplyTemplate覆蓋? – 2011-03-02 21:37:20

回答

0

當您訪問正在從ControlTemplate中拖出的HeaderControl時。 ControlTemplate中的元素被創建並添加爲控件的可視後裔。然後調用OnApplyTemplate方法,您可以通過它們的名稱訪問它們。

在第二種情況下,您只是將一個元素分配給Header屬性。在這種情況下,沒有辦法獲得「named」元素,因爲頭部被明確設置。

你可以直接投Header屬性,如果你知道這將是一個TextBlock,像這樣:

TextBlock tb = this.Header as TextBlock; 
if (tb != null) 
    tb.Text = Text; 

否則,你可以將TextBlock綁定到你的Text屬性在XAML中,像這樣:

<me:MyBaseControl.Header> 
<TextBlock Name="xxx" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type me:MyControl}}, Path=Text}" /> 
</me:MyBaseControl.Header> 

結合後一種方法是更好的方式去,因爲你是不依賴於一個給定的控制(即TextBlock的)。