2013-11-11 2 views
0

Добрый день, у меня есть пользовательское управление Popup, где пользователь взаимодействует с жестами. Я хочу, чтобы, когда пользователь нажимает на элемент изображения, вызывается метод и всплывающее окно закрывается. Но проблема, с которой я сталкиваюсь, заключается в том, что когда элемент изображения в usercontrol используется, все методы события нажатия в usercontrol запускаются. Я пробовал устанавливать разные gesturelistneners для каждого, но он, похоже, не работает. Вот мой код:Закрыть UserControl Popup с жестами Windows Phone

myPopUp = new Popup(); 
      myPopUp.Height = 400; 
      myPopUp.Width = 400; 
      //myPopUp.VerticalOffset = 100; 
      myPopUp.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
      myPopUp.VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      layout_menu layouts = new layout_menu(); 
      myPopUp.Child = layouts; 
      myPopUp.IsOpen = true; 

      GestureListener gesturelistener = GestureService.GetGestureListener(layouts); 
      gesturelistener.Tap += new EventHandler<GestureEventArgs>(onFirstImageTap); 

      GestureListener gesturelistener2 = GestureService.GetGestureListener(layouts); 
      gesturelistener2.Tap += new EventHandler<GestureEventArgs>(onSecondImageTap); 



     } 

     private void onFirstImageTap(object sender, GestureEventArgs e) 
     { 
      //LayoutPanel = 1; 
      MessageBox.Show("First image tapped"); 
      myPopUp.IsOpen = false; 
     } 

     private void onSecondImageTap(object sender, GestureEventArgs e) 
     { 
      MessageBox.Show("Second image tapped"); 
      myPopUp.IsOpen = false; 
     } 

Layout_menu XAML:

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Margin="0,0,10,0"> 
     <Grid x:Name="first_image_layout" HorizontalAlignment="Left" Height="150" Margin="13,10,0,0" VerticalAlignment="Top" Width="143"> 
      <Image HorizontalAlignment="Left" Height="99" Margin="18,33,0,0" VerticalAlignment="Top" Width="107" Source="/Assets/Images/Navigation_Pane.png"> 
       <toolkit:GestureService.GestureListener> 
        <toolkit:GestureListener Tap="onFirstImageTap"></toolkit:GestureListener> 
       </toolkit:GestureService.GestureListener> 
      </Image> 
     </Grid> 
     <Grid x:Name="second_image_layout" HorizontalAlignment="Left" Height="156" Margin="13,161,0,0" VerticalAlignment="Top" Width="143"> 
      <Image HorizontalAlignment="Left" Height="99" Margin="18,33,0,0" VerticalAlignment="Top" Width="107" Source="/Assets/Images/Navigation_Pane.png"> 
       <toolkit:GestureService.GestureListener> 
        <toolkit:GestureListener Tap="onSecondImageTap"></toolkit:GestureListener> 
       </toolkit:GestureService.GestureListener> 
      </Image> 
     </Grid> 

Как я закрыть всплывающее окно, когда одна часть изображения прослушивают? Решения высоко ценятся. Заранее спасибо.

+0

что «макеты» (ребенок всплывающего окна) –

+0

@ShawnKendrot да макетов является потомком всплывающего окна и просто UserControl, который я определен в xaml выше. Я отредактирую вопрос, я только заметил, что не определил его правильно – irobotxxx

+0

@ShawnKendrot Я его отредактировал. Xaml выше для Layout_menu, который я определяю как дочерний элемент всплывающего окна. Не могли бы вы взглянуть на него. Много спасибо – irobotxxx

ответ

0

Существует много способов сделать это, но я думаю, что лучше всего объявить пользовательские события в вашем пользовательском контроле.

Держите GestureListener объявлен в XAML в UserControl, как вы сделали, но добавить два пользовательских событий в коде-за:

public event EventHandler FirstImageTapped; 
public event EventHandler SecondImageTapped; 

Затем, все еще в UserControl, используйте onFirstImageTap и onSecondImageTap методы для запуска вашего события:

private void onFirstImageTap(object sender, GestureEventArgs e) 
{ 
    var eventHandler = this.FirstImageTapped; 

    if (eventHandler != null) 
    { 
     eventHandler(this, EventArgs.Empty); 
    } 
} 

private void onSecondImageTap(object sender, GestureEventArgs e) 
{ 
    var eventHandler = this.SecondImageTapped; 

    if (eventHandler != null) 
    { 
     eventHandler(this, EventArgs.Empty); 
    } 
} 

Наконец, в родительской странице, при создании всплывающих окон, подписаться на пользовательские события:

layout_menu layouts = new layout_menu(); 
layouts.FirstImageTapped += this.OnFirstImageTapped; 
layouts.SecondImageTapped += this.OnSecondImageTapped; 

И в обработчики событий, закрыть всплывающее окно:

private void OnFirstImageTapped(object sender, EventArgs e) 
{ 
    MessageBox.Show("First image tapped"); 
    myPopUp.IsOpen = false; 
} 

private void OnSecondImageTapped(object sender, EventArgs e) 
{ 
    MessageBox.Show("Second image tapped"); 
    myPopUp.IsOpen = false; 
} 
+0

большое спасибо. Я все еще получаю доступ к Microsoft C# и телефону Windows в целом. просто интересно, если бы я прошел всплывающее окно в качестве параметра конструктора layouts_menu и закрыл его оттуда, это сработало бы? – irobotxxx

+0

@manuelJ Это сработало бы, да. –

Смежные вопросы