从Windows手机中的代码处理ListBoxItem模板的点击事件

时间:2014-02-25 00:25:44

标签: c# xaml listbox windows-phone listboxitem

我在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组件返回。”

有关如何解决此问题的想法吗?

1 个答案:

答案 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"];
........