2013-07-03 53 views
0

我的XAML:更改元素屬性,在XAML描述,DataTemplate中

<Style x:Key="grid_image_panel" TargetType="ContentControl"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Grid x:Name="image_panel">      
        <Image Name="img" Source="Resources/rhcp.jpg" HorizontalAlignment="Center" VerticalAlignment="Center"/>      
       </Grid> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我需要在代碼隱藏 我的C#設置事件 「點擊」 的圖片 「IMG」:

DataTemplate dt = gridy.ContentTemplate as DataTemplate;

DataTemplate dt = gridy.ContentTemplate as DataTemplate;   
Grid grid = dt.LoadContent() as Grid; 

Image img = grid.Children.First() as Image; 
img.Tap += OnTapped; 

結果:通過使用例如輕點沒有奏效

回答

1

緩和的事Loaded事件:

 <DataTemplate> 
      <Grid x:Name="image_panel">      
       <Image Name="img" Loaded=OnImgLoaded Source="Resources/rhcp.jpg" HorizontalAlignment="Center" VerticalAlignment="Center" />      
      </Grid> 
     </DataTemplate> 

C#:

private void OnImgLoaded(object sender, RoutedEventArgs e) 
    { 
     // subscribe to your custom Tap event 
     (sender as Image).Tap += OnTapped; 
    } 

你肯定有這樣的事情:

public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
     "Tap", 
     RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), 
     typeof(MyClass)); 
+0

如果模板位於'ResourceDictionary',其中應該是,你不能爲'Loaded'' Event'設置一個處理程序。 –

+0

好的。然後你會通過一個附屬的財產。 wpf行爲概念基於那些,例如看[這裏](http://stackoverflow.com/questions/10683504/use-of-behavior-in-wpf-mvvm) – deafjeff

0

由於文檔說:

當你調用LoadContent,的UIElement創建DataTemplate中的對象,並且可以將它們添加到vis中另一個UIElement的ual樹。

這意味着,你的代碼上面,當你調用LoadContent你會得到一個新的集你Template定義UI元素的。你想要的是獲取已經加載到你的ContentControl's視覺樹中的圖像。

你必須得到視覺孩子爲了得到你的形象:

Image img = FindVisualChild<Image>(gridy); 
img.Tap += OnTapped; 

這是FindVisualChild方法:

private childItem FindVisualChild<childItem>(DependencyObject obj) 
    where childItem : DependencyObject 
{ 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 

     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 

     if (child != null && child is childItem) 
      return (childItem)child; 
     else 
     { 
      childItem childOfChild = FindVisualChild<childItem>(child); 
      if (childOfChild != null) 
       return childOfChild; 
     } 
    } 

    return null; 
}