2011-04-20 2 views
0

컨텍스트 메뉴에서 선택한 항목을 가져 오기나는 동적 이미지 세트를 생성하고이 같은 스택 패널에 넣어하고

private System.Windows.Controls.ContextMenu GetContextMenu() 
    { 
     System.Windows.Controls.MenuItem mi1; 
     System.Windows.Controls.MenuItem mi2; 

     System.Windows.Controls.ContextMenu _contextMenu = new System.Windows.Controls.ContextMenu(); 

     mi1 = new System.Windows.Controls.MenuItem(); 
     mi1.Header = "Show Normal Size"; 
     mi1.Click += new RoutedEventHandler(ContextMenuItem1_Click); 

     mi2 = new System.Windows.Controls.MenuItem(); 
     mi2.Header = "Remove image"; 
     mi2.Click += new RoutedEventHandler(ContextMenuItem2_Click); 

     _contextMenu.Items.Add(mi1); 
     _contextMenu.Items.Add(mi2); 
     return _contextMenu; 
    } 

은 이제 사용자가 올바른 이미지를 클릭하면 선택한 항목을 취득하고자하는 나는이 코드를 가지고있다 -

private void ContextMenuItem2_Click(object sender, RoutedEventArgs e) 
    { 
     object obj = e.OriginalSource; 

     string imageName = ((System.Windows.Controls.Image)obj).Name; 
     string[] split = imageName.Split('_'); 
     imageUploads.RemoveAt(Convert.ToInt32(split[1])); 
     DisplayImagesInStackPanel(imageUploads); 
    } 

그러나 obj에는 RoutedEventArgs 이후의 이미지 이름이 포함되어 있지 않습니다. 컨텍스트 메뉴에서 선택한 항목을 가져올 수있는 방법이 있습니까? 여러분의 도움과 의견이 논의 후 시간

+0

WPF를 사용하는 것을 고려하면 정적 콘텐츠로 이미지를 추가하지 말고 이미지 컬렉션에 컨트롤을 바인딩하는 것이 좋습니다. –

+0

안녕하세요. HB 이미지 컨트롤에 컨트롤을 바인딩하면 무엇을 의미하는지 정확히 알 수 있습니까? 당신은 List 에 이미지를 넣은 다음 그것을 패널에 바인딩하는 것을 의미합니까? – Johann

+0

가능한 가장 상위 수준의 클래스를 사용합니다. 즉, ImageSources 또는 URL 목록을 가지고 [DataTemplating] (http://msdn.microsoft.com/en-us/library/ms742521)을 사용하여 이미지를 자동으로 만들 수 있습니다. aspx). 또한 목록이 변경되면 ObservableCollection 을 사용하려고합니다. –

답변

3

에 대한

덕분에이 작동합니다 :

// The binding source. 
private readonly ObservableCollection<BitmapImage> _imageList = new ObservableCollection<BitmapImage>(); 
public ObservableCollection<BitmapImage> ImageList 
{ 
    get { return _imageList; } 
} 

이를 표시하고 설정하는 방법의 ContextMenu를 :

<ItemsControl ItemsSource="{Binding ImageList}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Image Source="{Binding}" Width="100" Height="100" 
         HorizontalAlignment="Left" Stretch="Fill" 
         VerticalAlignment="Top" ToolTip="Right-Click for Options"> 
        <Image.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Show Normal Size" Click="Image_CM_ShowNormalSize_Click" 
             Tag="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget}"/> <!-- The placement target is the object to which the context menu belongs, i.e. the image --> 
          <MenuItem Header="Remove Image" Click="Image_CM_RemoveImage_Click" 
             Tag="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}"/> <!-- The DataContext of the Image is the BitmapImage, which should be removed from the list --> 
         </ContextMenu> 
        </Image.ContextMenu> 
       </Image> 
       <Separator/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

무엇을 핸들러는 다음과 같이 보일 수 있습니다.

private void Image_CM_ShowNormalSize_Click(object sender, RoutedEventArgs e) 
{ 
    Image img = (sender as FrameworkElement).Tag as Image; 
    img.Width = (img.Source as BitmapImage).PixelWidth; 
    img.Height = (img.Source as BitmapImage).PixelHeight; 
} 

private void Image_CM_RemoveImage_Click(object sender, RoutedEventArgs e) 
{ 
    BitmapImage img = (sender as FrameworkElement).Tag as BitmapImage; 
    // If the image is removed from the bound list the respective visual elements 
    // will automatically be removed as well. 
    ImageList.Remove(img); 
} 
+0

HB가 환호를 보냅니다. – Johann

+0

안녕하세요. HB, 코드를 사용해 보았지만 이미지가 ItemsControl에 바인딩되지 않았습니다. ImageList가 채워지지만 ItemsControl에는 응답이 없습니다. 바인딩해야합니까? 또는 목록에 데이터가 채워지면 자동으로 바인드됩니까? – Johann

+0

잘 됐네! 이 ImageList = new ObservableCollection을 추가해야했습니다. (); DataContext = this; 코드 초기화에 . 도움 주셔서 감사합니다. HB – Johann

관련 문제