如何在Windows Phone 8中处理来自Hold事件的Tap事件?

时间:2014-04-15 09:44:59

标签: windows-phone-8 user-controls

我有一个usercontrol和tap事件,它位于usercontrol本身......并且我在电话申请页面中是那个用户控件的持有事件,这是父页面。我想从hold事件中提出点击事件我该怎样实现这个? ParentPage正在:

<DataTemplate x:Key="template" >
    <chatbubble:ChatBubbleControl x:Name="ChatBubble" Hold="ChatBubbleControl_Hold_1" />  
</DataTemplate>

UserControl正在......

<UserControl.Resources>
    ....
    <Grid x:Name="LayoutRoot" Background="Transparent" Width="455" Tap="chatBubble_Tap" >
    .....
   </Grid>

我想从ChatBubbleControl_Hold_1

中提取chatBubble_Tap事件

1 个答案:

答案 0 :(得分:0)

你可以尝试像这样举起你的活动:

// make your eventhandler in Parent Page public and static so it will be available thru all the App
public static void chatBubble_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    // your code
}

// then in your UserControl you should be able to call it like this:
private void ChatBubbleControl_Hold_1(object sender, System.Windows.Input.GestureEventArgs e)
{
    YourPage.chatBubble_Tap(sender, e);
}

这种情况取决于您在Tap事件中的内容(并非所有内容都采用静态方法)。

您还可以将页面的处理程序传递给UserControl,然后从处理程序调用Tap事件(在这种情况下,Tap事件可以是public(非静态)。简单的大小写如下所示:

// your Control in MainPage (or other Page)
<local:myControl x:Name="yourControl" VerticalAlignment="Center" Grid.Row="1"/>

// initializing control and event to be invoked:
public MainPage()
{
    InitializeComponent();
    yourControl.pageHandler = this;
}

public void second_Click(object sender, RoutedEventArgs e)
{
    // something here
}

// and the control code:
public partial class myControl : UserControl
{
    public Page pageHandler;

    public myControl()
    {
        InitializeComponent();
        myButton.Hold +=myButton_Hold;
    }

    private void myButton_Hold(object sender, System.Windows.Input.GestureEventArgs e)
    {
        if (pageHandler is MainPage) (pageHandler as MainPage).second_Click(sender, e);
    }
}

第三个选项是将Action传递给您的控件(在这种情况下,事件可以是私有的):

// code in MainPage (or your Page)
public MainPage()
{
    InitializeComponent();
    yourControl.myAction = second_Click; // setting an action of Control
}

private void second_Click(object sender, RoutedEventArgs e)
{
    // something here
}

// and the Control class
public partial class myControl : UserControl
{
    public Action<object, System.Windows.Input.GestureEventArgs> myAction;

    public myControl()
    {
        InitializeComponent();
        myButton.Hold +=myButton_Hold;
    }

    private void myButton_Hold(object sender, System.Windows.Input.GestureEventArgs e)
    {
        if (myAction != null) myAction.Invoke(sender, e);
    }
}