2012-06-27 2 views
0

내 프로그램의 "열린 파일"이 포함 된 동적 ListBox를 구현하려고합니다. 이 파일들은 ListBox에서 4 개의 캔버스 중 하나로 드래그 할 수 있습니다. 프로그램을 시작하기 전에 항목이 XAML에 추가되는 한 그 모든 내용이 제대로 작동하지만 일단 fileList.Items.Add ("myitemname");ListBox에 Items를 추가 한 후 DragDrop에서 NullReferenceException이 발생했습니다.

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> 

모든 내가 여기

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

내 코드의 관련 부분에 캔버스에 (작품을 드래그)를 삭제하려고하면 나는 NullReferenceException이를 얻을 수 아이디어가 기존 항목과 함께 작동하지만, fileList.Items.Add (".."); 또한 기존 항목의 경우 fileList.UnselectAll(); 잘 작동하지만 추가 된 항목이 선택 상태를 유지하고 선택 항목을 제거 할 수 없습니다.

+0

예외 스택 추적을 제공하십시오. 코드에서 예외가 발생한 위치를 보여줍니다. –

+0

정확히 어디에서 찾을 수 있습니까? 예외 후에 "DragDrop.DoDragDrop (listBox, dragData, DragDropEffects.Move); "부분이 도움이되는 경우 선택됩니다. 또한 테스트를 해봤는데 MessageBox.Show를 제거하면 충돌이 발생하지 않습니다. – phil13131

+0

'as as Canvas', '보낸 사람, ListBox'와 같이'as '를 사용한 여러 곳이 있습니다. 이후에 null을 확인해야합니다. 그. 보낸 사람이 예상 유형이 아닌 경우 null을 반환합니다. – Damith

답변

1

문제가 CanvasDrop입니다. 목록 상자의 SelectedItem 속성에는 xaml에서 만든 항목과 동적으로 추가하는 항목에 대해 서로 다른 값이 있으므로 ListBoxItem이 있지만 예상되는 문자열입니다.

+0

좋아요, 실제로 ListBox에 ListBoxItem을 실제로 추가하는 방법이 있습니까? UnselectAll()이 문자열에서 작동하지 않는 것 같습니다. – phil13131

+0

편집 : 흥미 롭습니다. ListBoxItem 대신 문자열로 변경하면 모두 작동하지만 UnselectAll()로는 선택 취소하지 않습니다. 항목의 이름이 같은 경우 다른 이름으로 작동합니다. – phil13131

+0

ListBoxItem을 추가하는 방법은 다음과 같습니다. fileList.Items.Add (new ListBoxItem {Content = "test"}); –

관련 문제