0

プログラムの「開いているファイル」を含む動的 ListBox を実装しようとしています。これらのファイルは、ListBox から 4 つのキャンバスのいずれかにドラッグできます。プログラムを開始する前に項目が XAML に追加されている限り、すべて問題なく動作しますが、fileList.Items.Add("myitemname"); を介して ListBox に項目を追加すると、それらを Canvas にドロップ (ドラッグが機能) しようとすると、NullReferenceException が発生します。

DragDrop.DoDragDrop(listBox, dragData, DragDropEffects.Move);

ここに私のコードの関連部分:

public partial class MainWindow : Window
{
    InitialDataObject _initData = new InitialDataObject();

    public MainWindow()
    {
        InitializeComponent();
    }


    #region DragImage

    private void DragImageStart(object sender, MouseButtonEventArgs e)
    {
        _initData._mousePoint = e.GetPosition(null);
    }

    private void DragImageMove(object sender, MouseEventArgs e)
    {
        Point mousePos = e.GetPosition(null);
        Vector diff = _initData._mousePoint - mousePos;

        if (e.LeftButton == MouseButtonState.Pressed && (
        Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
        Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) && ((sender as ListBox).SelectedItem != null))
        {
            var listBox = sender as ListBox;
            var listBoxItem = listBox.SelectedItem;
            DataObject dragData = new DataObject(_initData._dropIdentifier, listBoxItem);
            DragDrop.DoDragDrop(listBox, dragData, DragDropEffects.Move); 
        }

    }

    private void CanvasDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(_initData._dropIdentifier))
        {
            var item = e.Data.GetData(_initData._dropIdentifier) as ListBoxItem;
            (sender as Canvas).Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255));
            DropImage(sender as Canvas, item);
            fileList.UnselectAll();
        }
    }

    private void CanvasDragEnter(object sender, DragEventArgs e)
    {
        if (!e.Data.GetDataPresent(_initData._dropIdentifier) || sender == e.Source)
        {
            (sender as Canvas).Background = new SolidColorBrush(Color.FromArgb(255, 240, 240, 240));
            e.Effects = DragDropEffects.None;
        } 
    }

    private void DropImage(Canvas targetCanvas, ListBoxItem item)
    {
        //just to check if I got the right item in this method
        MessageBox.Show(item.Content.ToString());
    }

    private void CanvasDragLeave(object sender, DragEventArgs e)
    {
        if (!e.Data.GetDataPresent(_initData._dropIdentifier) || sender == e.Source)
        {
            (sender as Canvas).Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255));
        }
    }

    #endregion

    private void sdfsdf(object sender, RoutedEventArgs e)
    {
        fileList.Items.Add("test");
    }
}

class InitialDataObject
{
    public Point _mousePoint = new Point();
    public readonly string _dropIdentifier = "dropIdentifier";
}

XAML:

<Grid Height="Auto" HorizontalAlignment="Stretch" Margin="0,23,0,0" Name="gridSubmain" VerticalAlignment="Stretch" Width="Auto" Panel.ZIndex="2">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="250" MaxWidth="250" MinWidth="250" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <ListBox Height="Auto" Name="fileList" Width="Auto" Background="#FFE6E6E6" BorderBrush="{x:Null}" Panel.ZIndex="1" PreviewMouseLeftButtonDown="DragImageStart" PreviewMouseMove="DragImageMove" FontSize="16" ItemsSource="{Binding}" Margin="0" Grid.Row="2">
        <ListBoxItem Content="dfgdfg" />
        <ListBoxItem Content="sfsdf" />
        <ListBoxItem Content="ghjgh" />
        <ListBoxItem Content="cvbcvb" />
    </ListBox>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="112,196,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="sdfsdf" />
</Grid>
<Grid Grid.Column="1" Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="gridImage" VerticalAlignment="Stretch" Width="Auto">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
    <Canvas Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="canvasImage1" VerticalAlignment="Stretch" Width="Auto" AllowDrop="True" Drop="CanvasDrop" DragEnter="CanvasDragEnter" Background="White" DragLeave="CanvasDragLeave" />
    <Canvas Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="canvasImage2" VerticalAlignment="Stretch" Width="Auto" Drop="CanvasDrop" DragEnter="CanvasDragEnter" Grid.Column="1" AllowDrop="True" Background="White" DragLeave="CanvasDragLeave"/>
    <Canvas Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="canvasImage3" VerticalAlignment="Stretch" Width="Auto" Drop="CanvasDrop" DragEnter="CanvasDragEnter" Grid.Row="1" AllowDrop="True" Background="White" DragLeave="CanvasDragLeave"/>
    <Canvas Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="canvasImage4" VerticalAlignment="Stretch" Width="Auto" Drop="CanvasDrop" DragEnter="CanvasDragEnter" Grid.Column="1" Grid.Row="1" AllowDrop="True" Background="White" DragLeave="CanvasDragLeave"/>
</Grid>

fileList.Items.Add(".."); を介して追加されたアイテムではなく、既存のアイテムで機能する理由はありますか? また、既存のアイテムでは fileList.UnselectAll(); 正常に動作しますが、余分に追加されたアイテムが選択されたままになり、選択を取り除くことができません。

4

1 に答える 1

1

あなたの方法に問題がありますCanvasDropSelectedItemリスト ボックスのプロパティは、xaml で作成するアイテムと動的に追加するアイテムの値が異なるため、ListBoxItem が期待されますが、文字列を取得します。

于 2012-06-27T15:38:49.593 に答える