如何在WP7中拖动listboxitem?

时间:2012-05-03 13:10:27

标签: silverlight windows-phone-7 datatemplate

如下面的代码,我有一个listboxitem。 我想将listboxitem水平拖动到右边并消失。 但拖动它时,会弹出此错误,

transform.X + = e.Horizo​​ntalChange; [NullReferenceException]

我检查Watch,发现e.Horizo​​ntalChange的值为65.0,为什么显示错误?以及我如何实现目标?

<DataTemplate x:Key="TasksListDataTemplate">
    <StackPanel x:Name="stackPanel" Margin="0,0,0,10" RenderTransformOrigin="0.5,0.5">
            <toolkit:GestureService.GestureListener>
                <toolkit:GestureListener 
                    DragDelta="taskitem_DragDelta"
            </toolkit:GestureService.GestureListener>
        <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{Binding Title}" FontSize="{StaticResource PhoneFontSizeLarge}" HorizontalAlignment="Left" Width="432" RenderTransformOrigin="0.5,0.5">
        </TextBlock>
        <StackPanel x:Name="stackPanel1" Orientation="Horizontal" HorizontalAlignment="Left">
            <TextBlock x:Name="textBlock1" TextWrapping="Wrap" Text="due:" d:LayoutOverrides="Width" FontSize="{StaticResource PhoneFontSizeMedium}" RenderTransformOrigin="0.5,0.5">
            </TextBlock>
            <TextBlock x:Name="textBlock2" TextWrapping="Wrap" Text="{Binding DueDate}" d:LayoutOverrides="Width" FontSize="{StaticResource PhoneFontSizeMedium}" RenderTransformOrigin="0.5,0.5">
            </TextBlock>
        </StackPanel>
    </StackPanel>
</DataTemplate>

并且文件后面的代码是

    private void taskitem_DragDelta(object sender, DragDeltaGestureEventArgs e)
    {
        TranslateTransform transform = (sender as StackPanel).RenderTransform as TranslateTransform;
        transform.X += e.HorizontalChange;
    }

1 个答案:

答案 0 :(得分:1)

您的StackPanel没有指定TranslateTransform,因此.renderTransform属性在转换为TranslateTransform时为null。

原因是元素可以有多种不同类型的变换(CompositeTransformScaleTransformSkewTransformTranslateTransformRotateTransform等) 。默认情况下,元素根本没有RenderTransform

如果使用Blend编辑XAML,CompositeTransform是它创建的最常见类型(因为它包含一个对象中的许多不同类型的变换)。

TranslateTransform的声明中添加默认StackPanel,它应该有效。

<StackPanel x:Name="stackPanel" Margin="0,0,0,10" RenderTransformOrigin="0.5,0.5">
    <StackPanel.RenderTransform>
        <TranslateTransform X="0" Y="0"/>
    </StackPanel.RenderTransform>

作为旁注:您应该始终测试“as”操作的结果,因为它们可以为null。