2

正如下面的代码,我有一个列表框。我想将 listboxitem 水平向右拖动并消失。但是当拖动它时,会弹出这个错误,

变换.X += e.Horizo​​ntalChange; [空引用异常]

我查看手表,发现 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;
    }
4

1 回答 1

1

您的 StackPanel 没有TranslateTransform指定,因此 .RenderTransform 属性在转换为 .RenderTransform 时为空TranslateTransform

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

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

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”操作的结果,因为它们可以为空。

于 2012-05-03T13:29:33.870 回答