2010-05-12 17 views
0

我在我的WPF應用程序中有下一個控件模板。從ControlTemplate獲取代碼的控制按名稱

<Style TargetType="Label" x:Key="LabelStyle"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Label"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="40"/> 
          <ColumnDefinition/> 
         </Grid.ColumnDefinitions> 
         <TextBox x:Name="MyTextBlock" Text="{TemplateBinding Content}" Height="20" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
         <Label Content="{TemplateBinding Content}" Grid.Column="1" Grid.Row="1"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

TextBox「MyTextBlock」在窗口的C#代碼中是不可見的。我怎樣才能進入這個文本塊中的代碼

+0

可能重複:http://stackoverflow.com/questions/685077/how-to -dynamically-access-element-names-in-xaml – Amsakanna 2010-05-12 05:59:53

回答

4

試試你的屬性綁定到文本框的知名度直接

<TextBox Visibility="{Binding IsFieldCodesEnabled, Converter={StaticResource BoolToVis}}" /> 

其中BoolToVis被定義爲:

<Resouces> 
    <loc:BooleanToVisibilityConverter k:key="BoolToVis"/> 
</Resources> 
+0

是的!底線是,如果你在這種情況下試圖訪問代碼中的TextBox,你幾乎肯定會做一些非常錯誤的事情。這是一個很好的答案,因爲它顯示了這樣做的正確方法。如果可以的話,我會給你+10。 – 2010-05-12 23:22:51

+0

我喜歡這個解決方案。純粹和可以理解的。 ! – Polaris 2010-05-13 05:46:51

0

你可以做一個類似的東西,XAML頁面的代碼做後面的(除了你需要做的是在OnApplyTemplate覆蓋):

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

    var MyTextBlock = this.GetTemplateChild("MyTextBlock") 
} 

編輯只是注意到MyTextblock實際上是一個TextBox,所以將TextBox轉換爲TextBlock將導致異常。嘗試更新的代碼。

+0

這是不行的。我在Window.Resources中的ControlTemplate。我將代碼粘貼到我的應用程序中,並設置斷點來檢查變量。但MyTextBlock變量保留爲空。我做錯了什麼? – Polaris 2010-05-12 06:21:29

+0

您是否在XAML的標籤上設置了樣式?像這樣:'

+0

當然,我設置它。 – Polaris 2010-05-12 06:34:21

0

我發現了一些解決方案,爲我的情況。我只是在我的ControlTemplate中使用TextBox的加載事件

private void MyTextBlock_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBox txt = sender as TextBox; 
     if (txt!=null) 
     { 
      Messagebox.Show("It works"); 
     } 

    } 

但它不是那麼漂亮的解決方案。

+0

不!顯然,那並不優雅。除此之外,你能否告訴我需要訪問特定的文本框,以便我可以告訴你一個替代解決方案,因爲從代碼隱藏的名稱訪問元素幾乎不推薦。 – Amsakanna 2010-05-12 07:24:56

+0

我可以告訴你。我想隱藏TextBox是一些情況,並在需要時顯示它。那就是爲什麼我想要使用他的Visibility屬性來操作TextBox的實例。 – Polaris 2010-05-12 07:36:28

+0

如果需要,您可以在xaml中使用bind可見性屬性,而使用BindingConverter。如果你能告訴我能見度依賴的條件,我想我可以清楚地畫出來。 – Amsakanna 2010-05-12 09:33:08