2

以下のコードのように、リストボックス項目があります。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;
    }
4

1 に答える 1

1

StackPanel には がTranslateTransform指定されていないため、 にキャストすると .RenderTransform プロパティは null になりTranslateTransformます。

その理由は、要素がさまざまな種類の変換 ( CompositeTransformScaleTransformSkewTransform、など)を持つことができるTranslateTransformからです。RotateTransformデフォルトでは、要素には何もありませんRenderTransform

Blend を使用して XAML を編集する場合CompositeTransform、作成される最も一般的な型は a です (1 つのオブジェクトにさまざまな種類の変換が含まれるため)。

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 になる可能性があるため、常にテストする必要があります。

于 2012-05-03T13:29:33.870 に答える