簡體   English   中英

將項目添加到ListBox后,DragDrop中的NullReferenceException

[英]NullReferenceException in DragDrop after adding Items to ListBox

我正在嘗試實現一個動態的ListBox,其中包含程序的“打開文件”。 這些文件可以從列表框拖到四個畫布之一。 只要在啟動程序之前在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(); 效果很好,但是額外添加的項目保持選中狀態,我無法擺脫選擇。

CanvasDrop方法中的問題。 您希望在那里有ListBoxItem,但是會得到字符串,因為列表框的SelectedItem屬性對於在xaml中創建的項目和動態添加的項目具有不同的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM