2011-11-10 2 views
3

런타임 중에 추가 된 UserControl을 제거하는 방법을 다루는 몇 가지 게시물을 보았습니다. 그러나 문제는 조금 다릅니다. UserControl은 부모 캔버스에서 자체 (UserControl)를 제거하는 데 사용되는 오른쪽 상단 모서리에 작은 "x"단추가있는 이미지로 구성됩니다. 또한 사용자가 ListBoxItem에서 doubleclick 할 때 런타임 중에 UserControl이 추가된다는 점도 유의하십시오. 오른쪽 상단 모서리 버튼에 대한 Click 이벤트 핸들러가 있지만이 코드는 전혀 실행되지 않습니다. 단추를 클릭 할 때 도달하지 않은이 코드에 중단 점이 있기 때문에 이것을 알 수 있습니다.UserControl 내의 단추를 사용하여 런타임에 추가 된 UserControl 제거

그래서,

  1. 왜 제거 버튼의 클릭 이벤트가 처리되지 않는?
  2. 아마 이것을 구현하는 더 좋은 방법이 있습니다. 제발 조언.

    private void MyListBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) 
        { 
         if (e.OriginalSource.ToString() == "System.Windows.Controls.Border" || e.OriginalSource.ToString() == "System.Windows.Controls.Image" || e.OriginalSource.ToString() == "System.Windows.Controls.TextBlock") 
         { 
          Expression.Blend.SampleData.MyCollection.Dataset lbi = ((sender as ListBox).SelectedItem as Expression.Blend.SampleData.MyCollection.Dataset); 
          var new_usercontrol = new MyUserControl(); 
          new_usercontrol.MyImageSourceProperty = lbi.Image; 
          MyCanvas.Children.Add(new_usercontrol); 
          Canvas.SetLeft(new_usercontrol, 100); 
          Canvas.SetTop(new_usercontrol, 100); 
          Canvas.SetZIndex(new_usercontrol, 100); 
         } 
        } 
    

    다음 UserControl을위한 CS 코드는 다음과 같습니다 : 여기

은 추가에 사용되는 코드의

public partial class ModuleElement : UserControl 
    { 

     public ImageSource MyProperty 
     { 
      get { return (ImageSource)this.image.Source; } 
      set { this.image.Source = value; } 
     } 

     public ModuleElement() 
     { 
      this.InitializeComponent(); 
     } 

     private void RemoveButton_Click(object sender, RoutedEventArgs e) 
     { 
      ((Canvas)this.Parent).Children.Remove(this); 
     } 
    } 

XAML :

<Grid x:Name="LayoutRoot"> 
    <Image x:Name="image" /> 
    <Button x:Name="RemoveButton" Content="X" HorizontalAlignment="Right" Height="17.834" Margin="0" VerticalAlignment="Top" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="RemoveButton_Click"> 
    </Button> 
</Grid> 

감사에서 advance,

브라이언

+2

오 형제는 문자열을 비교하여 유형을 확인합니다. 마치 유형을 확인하는 것만으로는 충분하지 않은 것처럼 보입니다! 이 체크를'e.OriginalSource.GetType() == typeof (Border)'또는'e.OriginalSource is Border' (서브 클래스도 허용해야 함)로 변경하십시오. –

+0

감사합니다. – Bryan

답변

0

그래서 일부 이름 변경을 제외하고 정확히 여기에서 코드를 시도했지만 문제를 재현하지 못했습니다. 내 개인적인 경험에서 여기에 귀하의 문제는 어떤 이유로 클릭에 대한 이벤트가 제대로 구독되지 않아야합니다. 이를 위해 사용자 컨트 롤을 위해 디자이너로 가서 버튼에 대한 현재 이벤트를 지우고 VS 또는 Blend가 적절한 구독에 필요한 모든 코드를 생성하도록 디자이너 이벤트 텍스트 상자에서 두 번 클릭합니다.

코드 here을 기반으로 샘플을 만들었습니다. 아래로 당기고 어떤 불일치가 있는지 찾아보십시오.

좋은 구현 방법은 좋은 이전 MVVM 패턴과 MVVM Light Toolkit입니다. 이를 통해 코드 명령없이 모든 단추 명령과 바인딩을 처리하는 중앙 ViewModel 클래스를 가질 수 있습니다.

관련 문제