2013-11-14 5 views
0

Мне нужно вызвать метод в моем классе MainPage.xaml.cs, когда событие обрабатывается в дочернем элементе управления. Вызов this.Parent не работает, потому что она возвращает только первый DependencyObject в дереве, и я не могу получить PhoneApplicationPage от этогоКак получить родительский контейнер, например. PhoneApplicationPage, в Windows Phone?

У меня есть следующий макет в моем PhoneApplicationPage:

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="AUTO"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="AUTO"/> 
    </Grid.RowDefinitions> 

    <Grid Height="85" VerticalAlignment="Top" Grid.Row="0"></Grid> 

    <Grid Grid.Row="1" Name="gridContent" /> 

    <ug:UniformGrid Rows="1" Columns="5" Height="85" VerticalAlignment="Bottom" Grid.Row="2"> 
     <tabs:TabItem Name="tabOverview" TabItemText="OVERVIEW" TabItemImage="overview_64.png" /> 
     <tabs:TabItem Name="tabLogs" TabItemText="LOGS" TabItemImage="log_64.png"/>   
    </ug:UniformGrid> 
</Grid> 

с следующий код:

public partial class MainPage : PhoneApplicationPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     gridContent.Children.Add(new OverviewUserControl()); 
    } 

    public void UpdateContent(UserControl control) 
    { 
     // I need to call this method from the TabItem Tap event 
     gridContent.Children.Clear(); 
     gridContent.Children.Add(control); 
    } 
} 

Когда происходит событие крана, мне нужно заменить содержимое gridContent с тем, что соответствует крану пользователя. это, как я обрабатывать событие водопроводную:

private void TabItem_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 

    // var parent = this.Parent; //<-- this doesn't get the PhoneApplicationPage 

    var ti = sender as TabItem; 
    if (ti != null) 
    { 
     string tab = ""; 
     switch (ti.Name) 
     { 
      case "tabOverview": 
       // I need a reference to MainPage here to call 
       // MainPage.UpdateContent(new LogsUserControl()) 
       break; 
      case "tabLogs": 
       // I need a reference to MainPage here to call 
       // MainPage.UpdateContent(new OverviewUserControl()) 
       break; 
     } 

    } 
} 

Вопрос

Таким образом, вопрос, как я могу вызвать метод в MainPage от TabItem_Tap?

ответ

2

Это сделал:

var currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content as MainPage; 

Использование:

private void TabItem_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    var currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content as MainPage; 

    if (ti != null) 
    { 
     switch (ti.Name) 
     { 
      case "tabOverview": 
       currentPage.UpdateContent(new OverviewUserControl()); 
       break; 
      case "tabLogs": 
       currentPage.UpdateContent(new LogsUserControl()); 
       break; 
     } 
    } 
} 
Смежные вопросы