Может быть, этот вопрос немного глуп, но я застрял прямо сейчас.
В настоящее время я работаю над классом с TextBox и TextBlock. Когда вы вводите что-то в TextBox, TextChangedEventHandler должен обновить 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!
}
};
`
Хорошо, прежде всего спасибо Ханс Пассант и Нико Чжу за вашу помощь. Я не мог использовать:
tb->TextChanged += ref new Windows::UI::Xaml::Controls::TextChangedEventHandler(&tb_TextChanged);
потому что мой класс был стандартным классом c ++. Сначала я должен был объявить его как C ++ / CX, например:
ref class Test sealed {
...
};
Но с этим определением я теперь могу передать «это» в функцию.
<3
Вытекают из этот случай.
Многое из ООП можно рассматривать с точки зрения передачи сообщений.
Вызов метода — это сообщение от вызывающей стороны к вызываемой стороне (с параметрами) и возвращаемое сообщение с возвращаемым значением.
Событие — это сообщение от источника подписчику. Таким образом, потенциально могут быть задействованы два экземпляра: один отправляет сообщение, а второй получает его.
При статическом событии отправляющий экземпляр отсутствует (просто тип, который может быть или не быть классом). Все еще может быть экземпляр получателя, закодированный как цель делегата.
Вы можете использовать нестатического подписчика для 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;
}