我在Windows Phone中使用Panorama Control。在Panorama控件中,我从代码中动态添加Panorama项目。在PanoramaItem中,我设置了ListBox。我从代码中为ListBox设置ItemTemplate。这是我设置ItemTemplate的代码。
private void AddContentInPanoramaItem(PanoramaItem panoramaItem)
{
ListBox listBox = new ListBox();
DataTemplate itemTmp = (DataTemplate)XamlReader.Load(
@"<DataTemplate xmlns=""http://schemas.microsoft.com/client/2007"">
<Grid Background=""Green"" Width=""400"" Margin=""0 10 0 10"">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=""Auto""/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Background=""White"" Margin=""5 0 5 0"" Width=""60"" Height=""100"" Grid.RowSpan=""2"" CornerRadius=""1"">
<Image Source=""Assets\phoneImage.png"" />
</Border>
<TextBlock Text=""{Binding Name}"" FontSize=""35"" Grid.Column=""1"" />
<TextBlock Text=""{Binding Number}"" FontSize=""20"" Grid.Column=""1"" Grid.Row=""2"" />
</Grid>
</DataTemplate>");
listBox.ItemTemplate = itemTmp;
var contacts = from contact in m_contactList
where contact.Category == panoramaItem.Header.ToString()
orderby contact.Name
select contact;
listBox.ItemsSource = contacts;
panoramaItem.Content = listBox;
}
现在我要添加tap事件。我定义了一个处理点击事件的方法。
private void Border_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{}
但是当我在标签中添加Tap =“”Border_Tap“”时,我的应用程序就会崩溃。例外情况说“错误HRESULT E_FAIL已从调用COM组件返回。”
有关如何解决此问题的想法吗?
答案 0 :(得分:1)
简短的回答你不能这样做:
XAML for Load不应尝试指定x:Class,也不应包含事件处理程序的任何XAML定义属性。加载逻辑无法在运行时将加载的XAML与代码隐藏类集成。如果要添加事件处理程序,则必须通过引用从Load结果的对象树结构中获取的对象,并使用特定于语言的语法来附加处理程序(例如+ =)来在代码中执行此操作。有关使用代码附加事件的更多信息,请参阅Silverlight的事件概述。 [Source]
到目前为止,我还没有看到任何简单的解决方法。如果可能的话,只需在XAML中定义<DataTemplate>
,将其放在页面的资源中,然后就可以从代码中使用它了:
<phone:PhoneApplicationPage.Resources>
<DataTemplate xmlns="http://schemas.microsoft.com/client/2007" x:Key="listBoxItemTemplate">
<Grid Background="Green" Width="400" Margin="0 10 0 10">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Tap="Border_Tap" Background="White" Margin="5 0 5 0" Width="60" Height="100" Grid.RowSpan="2" CornerRadius="1">
<Image Source="Assets\phoneImage.png" />
</Border>
<TextBlock Text="{Binding Name}" FontSize="35" Grid.Column="1" />
<TextBlock Text="{Binding Number}" FontSize="20" Grid.Column="1" Grid.Row="2" />
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
//in C# code
........
listBox.ItemTemplate = (DataTemplate)this.Resources["listBoxItemTemplate"];
........