也许这个问题有点愚蠢,但我现在陷入困境。
我目前正在研究带有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!
}
};
`
答案 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;
}