2016-02-13 83 views
1

我想附加一個點擊事件到我的容器,但C++/cx的方式逃避我。 XAML和程序化方法都讓我感到沮喪。我如何附加一般事件? (?特別按鈕的Click事件)無論是通過下列方式爲我工作:附加事件

<StackPanel x:Name="stackPanel" Button.Click="stackPanel_Click"> 
    <Button>Button #1</Button> 
    <Button>Button #2</Button>  
</StackPanel> 

這只是給出了錯誤,「未知的可拆卸部件‘Button.Click’元素‘的StackPanel’呢。 ,這是它是如何在WPF做,編程方式:

stackPanel->AddHandler(
    Windows::UI::Xaml::Controls::Button::Click, 
    ref new Windows::UI::Xaml::RoutedEventHandler(this, stackPanel_Click), 
    false); 

這給了「錯誤:非靜態成員引用必須是相對於特定對象」 - 這是指的AddHandler的第一個參數

我大多瞭解給出的錯誤,但仍然沒有線索如何完成我想要的。搜索引擎沒有幫助,微軟的文檔也沒有啓發。

+0

這就是爲什麼我需要附加事件。當按鈕Click事件觸發時,它會冒泡到StackPanel - 這段代碼在C#WPF中工作正常,但在C++/cx中沒有UWP應用程序。 – JBird

回答

0

經過一番思考和多一點研究後,我發現瞭解決方案。

XAML

<StackPanel x:Name="stackPanel" UIElement.Tapped="stackPanel_Tapped"> 
    <Button>Button #1</Button> 
    <Button>Button #2</Button> 
</StackPanel> 

代碼

// For in-code-only setup, consider this constructor and 
// OnLoaded code. 
MyPage::MyPage() { 
    InitializeComponent(); 

    Loaded += ref new Windows::UI::Xaml::RoutedEventHandler(this, &MyPage::OnLoaded); 
} 

void MyPage::OnLoaded(Platform::Object^ sender, RoutedEventArgs^ e) { 
    stackPanel->AddHandler(
    UIElement::TappedEvent, 
    ref new TappedEventHandler(this, &MyPage::stackPanel_Tapped), 
    false); 
} 

// If you setup the event handling in XAML this is the only code you'll need. 
void MyPage::stackPanel_Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e) { 
    // Event handling code . . . 
} 

的原因,第一個例子代碼沒有工作是,似乎沒有要到RoutedEvent對象點擊,任何參考其將按照慣例命名爲ClickEvent。儘管如此,文檔仍然說Button :: Click是一個路由事件。該平臺似乎贊成更高層次的抽象,而是定義了一個名爲Tapped的路由事件。 UWP應用程序可以運行在許多不同的設備上,而不是所有設備都有鼠標或光標。可以使用點擊和點擊兩種事件,但只有點擊才能用作附加事件 - 它是我們唯一可以訪問路由事件的RoutedEvent對象的唯一一個事件。

第二個值得注意的和非常相關的點是在代碼實現中。您傳遞名爲TappedEvent的RoutedEvent對象,而不傳遞名爲Tapped的事件。我只提到它,因爲XAML代碼可能會欺騙您只需鍵入Tapped而不是TappedEvent,即使您在intellisense中查看AddHandler函數原型,也可能讓您撓頭。

+1

UWP XAML中的Click事件不通過樹。你當然可以在按鈕本身添加一個'Click'處理程序。另外,你應該在它被提出時立即解開Loaded事件,因爲它可能會在未來再次被提升,並且你會有兩個'Tapped'處理器。 –

+0

@ PeterTorr-MSFT感謝您指出加載事件的潛在問題。據我瞭解,當離開一個頁面時,頁面對象被序列化。然後,如果您碰巧導航到「返回」頁面,則會創建另一個實例並將該對象「重新水化」。這是你想到的情況嗎?還是有另一種Loaded被調用的情況,但原始對象沒有被銷燬?代碼的這部分模型來自微軟網站的代碼,所以我將其包含在內。 (在UWP頁面上似乎沒有KeepAlive屬性來做這件事。) – JBird

+1

導航可根據各種情況回收頁面。另外一般情況下,如果頁面(或其父項)被移除並重新添加到樹中,您可以獲得另一個Loaded事件,例如作爲某些轉換或響應式設計的一部分。 –