2013-11-28 28 views
0

我有一個wpf c#customControl與下面的DataGrid。 我想獲得的邊界在DataTemplate中,我可以在從DataGrid的CellTemplate的Costum控件GetTemplateChild

public override void OnApplyTemplate() 
{ 
    var dataGrid = GetTemplateChild("PART_DataGrid") as DataGrid; 
    var tempColumn = GetTemplateChild("PART_TempColumn") as DataGridTemplateColumn; 

} 

與DataGrid和DataGridTemplateColumn做爲什麼

var timerPointer = GetTemplateChild("PART_Border") as Border; 

是不行的(總是空),我怎麼弄邊界?

<DataGrid x:Name="PART_DataGrid" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn x:Name="PART_TempColumn" > 
      <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Border x:Name="PART_Border" > 
       </Border> 
      </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Part_DataGrid是否在ControlTemplate中? –

+0

是的,它是控制模板樣式的內部 – user3045392

+0

看看我給你的答案。 –

回答

0

其不工作的原因是因爲您在ControlTemplate範圍內搜索,但元素在DataTemplate範圍內定義。

下面是一個如何使它運行的例子。

這是ControlTemplate,就像你擁有它一樣。

<Style TargetType="{x:Type local:CustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <StackPanel> 
         <Button x:Name="bttn"> 
          <Button.ContentTemplate> 
           <DataTemplate> 
            <TextBlock x:Name="txtBlock" Text="{Binding}"/> 
           </DataTemplate> 
          </Button.ContentTemplate> 
         click me 
        </Button> 
        </StackPanel> 
       </Border> 
      </ControlTemplate> 

這就是OnApplyTemplate方法。

public override void OnApplyTemplate() 
    { 
     Dispatcher.BeginInvoke(
      DispatcherPriority.Loaded, 
      new Action(
       () => 
        { 
         var button = this.GetTemplateChild("bttn") as Button; 
         for (DependencyObject child = VisualTreeHelper.GetChild(button, 0); 
          child != null;) 
         { 
          if (child is ContentPresenter) 
          { 
           var parent = (ContentPresenter)child; 
           var element = parent.ContentTemplate.FindName("txtBlock", parent) as TextBlock; 
           if (element != null) 
           { 
            Console.WriteLine("Found it!"); 
            break; 
           } 
          } 

          if (VisualTreeHelper.GetChildrenCount(child) > 0) 
          { 
           child = VisualTreeHelper.GetChild(child, 0); 
          } 
         } 
        })); 

     base.OnApplyTemplate(); 
    } 

正如您所見,您首先需要找到合適的範圍,然後才能搜索元素的名稱。

相關問題