2013-09-22 53 views
0

我有一個電話應用程序頁面(Main.xaml),其中包含ItemsControl和其項目的數據模板。將事件處理程序添加到獨立ResourceDictionary文件中模板中的ItemsControl項目

<phone:PhoneApplicationPage.Resources> 
    <local:MainItemsViewModel x:Key="mainItems" /> 
    <DataTemplate x:Key="ItemTemplate"> 
     <Grid Tap="Item_Tap"> 
      <!--....--> 
     </Grid> 
    </DataTemplate> 
</phone:PhoneApplicationPage.Resources> 

<!--...a lot of xaml...--> 

<ItemsControl 
     x:Name="MainCanvas" 
     DataContext="{StaticResource mapItems}" 
     ItemsSource="{Binding Path=Buttons}" 
     ItemTemplate="{StaticResource ItemTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
        <Canvas Width="4000" Height="4000" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
</ItemsControl> 

如上圖所示,DataTemplate中具有在後臺代碼文件(MainPage.xaml.cs中)定義的事件處理程序:

private void Item_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    FrameworkElement fe = sender as FrameworkElement; 
    //working with fe... 

    ApplicationBar.IsVisible = true; 
    e.Handled = true; 
} 

而且一切都運行完美。但我想將數據模板移動到單獨的ResourceDictionary文件(ResDict.xaml)。當然,由於Item_Tap事件處理程序現在無法被觸發,所以出現錯誤。是否可以在ResourceDictionary中包含一個可調用Item_Tap方法的事件處理程序?

回答

0

我找到了解決方案。可能它不是最好的,但它適用於我。 在頁面構造函數中,我添加了LayoutUpdate事件的事件處理程序:

MainCanvas.LayoutUpdated += MainCanvas_LayoutUpdated; 

在此事件處理(MainCanvas_LayoutUpdated)我調用包含的代碼波紋管的方法:

foreach (var item in MainCanvas.Items) 
{ 
     DependencyObject icg = MainCanvas.ItemContainerGenerator.ContainerFromItem(item); 
     (icg as FrameworkElement).Tap += MainItem_Tap; 
} 

它結合事件處理程序ItemsControl(MainCanvas)中項目源項目更改和項目後的所有項目顯示在畫布上。

可能會對某人有幫助。謝謝!

相關問題