0

ItemsControl項目のデータ テンプレートを含む電話アプリケーション ページ (Main.xaml) があります。

<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 イベント ハンドラーを起動できなかったため、確かにエラーが発生しました。Item_Tap メソッドを呼び出す ResourceDictionary にイベント ハンドラを含めることは可能ですか?

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 に答える