0

我有一个电话应用程序页面 (Main.xaml),其中包含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 方法的事件处理程序?

4

1 回答 1

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;
}

在其 itemsource 更改并且项目显示在 Canvas 之后,它为 ItemsControl (MainCanvas) 中的所有项目绑定事件处理程序。

可能对某人有帮助。谢谢!

于 2013-09-22T13:16:51.040 回答