将事件处理程序添加到单独的资源字典文件内的模板中的项控件项
本文关键字:控件 文件 资源 程序 事件处理 添加 单独 字典 | 更新日期: 2023-09-27 18:32:27
我有一个电话应用程序页面(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;
}
一切都很完美。但是我想将数据模板移动到单独的资源字典文件(ResDict.xaml)。 当然,我收到错误Item_Tap因为现在无法触发事件处理程序。 是否可以在资源字典中包含调用Item_Tap方法的事件处理程序?
我找到了解决方案。可能它不是最好的,但它对我有用。在页面构造函数中,我为 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 更改和项显示在画布上后,它会绑定 ItemsControl (MainCanvas) 中所有项的事件处理程序。
也许对某人有帮助。谢谢!