我可以在C ++ / UWP中使EventHandlers为非静态成员函数吗?

时间:2018-07-24 22:03:34

标签: c++ uwp eventhandler

也许这个问题有点愚蠢,但我现在陷入困境。

我目前正在研究带有TextBox和TextBlock的类。当您在TextBox中键入内容时,TextChangedEventHandler应该使用相同的Text更新TextBlock。但是由于EventHandler函数是静态的,所以我无法获取TextBlock,因为它当然是非静态的。有没有办法正确执行此操作,或者可以使EventHandlers非静态?

这是我的课程:

class Test {
    TextBlock^ tbl;
    TextBox^ tb;
public:
    Test(StackPanel^ parent) {
        tbl = ref new TextBlock;
        tb = ref new TextBox;
        tb += ref new Windows::UI::Xaml::Controls::TextChangedEventHandler(&tb_TextChanged);
        parent->Children->Append(tbl);
        parent->Children->Append(tb);
    }
    static void tb_TextChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::TextChangedEventArgs ^e) {
        tbl->Text = static_cast<TextBox^>(sender)->Text; //this doesnt work unfortunately! 
    }
};

`

2 个答案:

答案 0 :(得分:1)

首先,感谢Hans Passant和Nico Zhu的帮助。我无法使用:

tb->TextChanged += ref new Windows::UI::Xaml::Controls::TextChangedEventHandler(&tb_TextChanged);

因为我的课是一个标准的c ++类。我必须先将其声明为C ++ / CX,例如:

ref class Test sealed {
    ...
};

但是有了定义,我现在可以将“ this”传递给函数了。 <3

答案 1 :(得分:0)

源自this case

  

可以从消息传递的角度来考虑很多OOP。

     

方法调用是从调用者到被调用者的消息(带有参数),然后是带有返回值的消息。

     

事件是从源到订户的消息。因此,可能涉及两个实例,一个实例发送消息,另一个实例接收消息。

     

对于静态事件,没有发送实例(只是一个类型,可能是也可能不是类)。仍然会有一个收件人实例被编码为委托的目标。

您可以为TextChanged使用非静态订阅者,如下所示。

MainPage::MainPage()
{
    InitializeComponent();
    rootLayout = ref new StackPanel;

    tbl = ref new TextBlock;
    tb = ref new TextBox;
    rootLayout->Children->Append(tbl);
    rootLayout->Children->Append(tb);
    tb->TextChanged += ref new Windows::UI::Xaml::Controls::TextChangedEventHandler(this, &App17::MainPage::OnTextChanged);
    Content = rootLayout;
}

void App17::MainPage::OnTextChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::TextChangedEventArgs ^e)
{
    tbl->Text = static_cast<TextBox^>(sender)->Text;
}