2011-01-07 47 views
0

只是一個例子,我在template.xaml下面的代碼。如何通過資源字典從xaml到C#的元素?

<Border x:Name="PART_ButtonNormal" Grid.Column="0"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Border Name="PART_ImageBorder" Grid.Column="0"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
       <Image Margin="2" Width="16"           Source="{Binding Path=SmallIcon, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"/> 
       <Border Height="20" Grid.Row="1" Background="Red"/> 
      </Grid> 
     </Border> 
     <TextBlock Grid.Column="1" x:Name="PART_Text" Text="{TemplateBinding Label}" 
            Foreground="{TemplateBinding Foreground}" 
            FontFamily="{TemplateBinding FontFamily}" 
            FontSize="{TemplateBinding FontSize}" 
            VerticalAlignment="{TemplateBinding VerticalAlignment}"       
            HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
            Margin="2,0,4,0"/> 
    </Grid> 
</Border> 

我通過Resource dictionary在Wrapper.cs類中讀到了這個xaml。那麼我怎樣才能從Wrapper.cs中的template.xaml訪問Image元素。

請問任何一個給我的解決方案?

問候, 大衛Ç

回答

0

你想要的Image實例的模板應用於實際Control後?如果您在將其應用到Control之前嘗試修改ControlTemplate本身,我不確定這是可能的。

但是,如果你想從該模板應用於給定Control的圖片,你可以走可視化樹:

public Image FindImage(Control parent) 
{ 
    Queue<DependencyObject> items = new Queue<DependencyObject>(); 
    items.Enqueue(parent); 

    while (items.Count > 0) 
    { 
     var item = items.Dequeue() as Visual; 
     if (item is Image) 
      return item; 

     var count = VisualTreeHelper.GetChildrenCount(item); 
     for (int i = 0; i < count; ++i) 
      items.Enqueue(VisualTreeHelper.GetChild(item, i)); 
    } 
}