2012-03-15 195 views
0

一個的ButtonStyle內艾策斯文本塊文本如何從後面代碼定製的風格訪問tbRegistrationBtn.text財產?從代碼隱藏

我的按鈕是從代碼隱藏動態創建的,並被添加到父控件(stackpanel)中: 當我按下屏幕上的其他按鈕時,該按鈕被創建。

代碼隱藏:

   Button newBtn = new Button(); 
       newBtn.Width = 160; 
       newBtn.Height = 46; 
       newBtn.Style = this.FindResource("ButtonStyleRegistration") as Style; 
       spHorizontal.Children.Add(newBtn); 

的XAML:

 <Style x:Key="ButtonStyleRegistration" TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid x:Name="registrationButton"> 
         <Rectangle Fill="#FF89959A" Height="Auto" RadiusY="15" RadiusX="15" Stroke="White" Width="Auto"/> 
         <TextBlock x:Name="tbRegistrationBtn" TextWrapping="Wrap" Text="" HorizontalAlignment="Center" Margin="7.5,14.973,0,16.84" d:LayoutOverrides="Height"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsFocused" Value="True"/> 
         <Trigger Property="IsDefaulted" Value="True"/> 
         <Trigger Property="IsMouseOver" Value="True"/> 
         <Trigger Property="IsPressed" Value="True"/> 
         <Trigger Property="IsEnabled" Value="False"/> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="FontSize" Value="10.667"/> 
    </Style> 

任何試圖檢索一個空的錯誤文字塊的結果。 嘗試:

  Style style = this.FindResource("ButtonStyleRegistration") as Style; 
      newBtn.Style = style; 
      TextBlock tb = (TextBlock)style.Resources.FindName("tbRegistrationBtn"); 
      tb.Text = "test"; 

此致敬禮。

回答

0

您可以使用VisualTreeHelper來瀏覽按鈕的視覺樹。使用這個輔助函數:

public static T FindVisualChild<T>(DependencyObject obj, string name) 
    where T : DependencyObject 
{ 
    var count = VisualTreeHelper.GetChildrenCount(obj); 
    for(int i = 0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(obj, i); 

     if(child != null) 
     { 
      var res = child as T; 
      if(res != null && (string)res.GetValue(FrameworkElement.NameProperty) == name) 
      { 
       return res; 
      } 
      res = FindVisualChild<T>(child, name); 
      if(res != null) return res; 
     } 
    } 

    return null; 
} 

還需要強制您的按鈕來構建它是一個基於模板的(因爲它是默認延遲)可視樹:

newBtn.ApplyTemplate(); 

最後設置你的TextBlock文字:

var tb = FindVisualChild<TextBlock>(newBtn, "tbRegistrationBtn"); 
tb.Text = "Registration"; 
+0

謝謝你一堆完美的作品!沒想到訪問一個簡單的控件會很複雜。 – Rakr 2012-03-15 08:44:13

+0

@Rakr:已經有一種方法來查找模板中的控件,它被稱爲['FindName'](http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx) ,人們真的很喜歡拋棄'FindVisualChild'方法,原因不明。 – 2012-03-17 04:01:27

+0

@Rakr:另外如果有什麼事情很難做到的話,那麼你首先不會*意味着*做到這一點(在那個筆記上我會指向Silvermind的答案)。 – 2012-03-17 04:07:18

0

max的答案是最適合您的情況。 但是,爲什麼不這樣做:

<TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}" 
      HorizontalAlignment="Center" Margin="7.5,14.973,0,16.84"/> 

比你可以在代碼中設置隱藏newBtn.Content = "test"