2013-02-21 3 views
0

Я сильно изменил MS mandelbrot example и около половины выпустить приложение, основанное на нем.Связь между классами

Я пытаюсь связать страницы вместе, но я замечаю, что первичный класс не имеет доступа к любому из вторичных классов.

Классы кажутся тесно связанными со страницами, и основной класс, по-видимому, способен создавать и загружать эти страницы «на лету», не получая дескриптора класса (где я мог привязать событие к делегату).

Из MainPage.xaml.cs:

public void LoadScenario(Type scenarioClass) 
{ 
    AutoSizeInputSectionWhenSnapped = true; 

    // Load the ScenarioX.xaml file into the Frame. 
    HiddenFrame.Navigate(scenarioClass, this); 

    if (scenarioClass == typeof(TitleScreen)) 
    { 
     // connect event handler here? how? 
     //  EventHandler e = scenarioClass.PageEventHandler(HandleChangePageCall); 
     // scenarioClass is a Type, so any events are not in scope 
    } 

    // Get the top element, the Page, so we can look up the elements 
    // that represent the input and output sections of the ScenarioX file. 
    Page hiddenPage = HiddenFrame.Content as Page; 

    // Get each element. 
    UIElement input = hiddenPage.FindName("Input") as UIElement; 
    UIElement output = hiddenPage.FindName("Output") as UIElement; 
    UIElement entireScreen = hiddenPage.FindName("LayoutRoot") as UIElement; 

    if (entireScreen == null) 
    { 
     // Malformed input section. 
     NotifyUser(String.Format(
      "Cannot load this screen: {0}. Make sure root of input section markup has x:Name of 'entireScreen'", 
      scenarioClass.Name), NotifyType.ErrorMessage); 
     return; 
    } 

    if (output == null) 
    { 
     // Malformed input section. 
     NotifyUser(String.Format(
      "Cannot load this screen: {0}. Make sure root of input section markup has x:Name of 'Output'", 
      scenarioClass.Name), NotifyType.ErrorMessage); 
     return; 
    } 

    // Find the LayoutRoot which parents the input and output sections in the main page. 
    Panel panel = hiddenPage.FindName("LayoutRoot") as Panel; 

    if (panel != null) 
    { 
     // Get rid of the content that is currently in the intput and output sections. 
     panel.Children.Remove(input); 
     panel.Children.Remove(output); 
     //panel.Children.Remove(entireScreen); 

     //// Populate the input and output sections with the newly loaded content. 
     //InputSection.Content = input; 
     OutputSection.Content = output; 
     //OutputSection.Content = entireScreen; // doesn't fall within the expected range 
    } 
    else 
    { 
     // Malformed Scenario file. 
     NotifyUser(String.Format(
      "Cannot load scenario: '{0}'. Make sure root tag in the '{0}' file has an x:Name of 'LayoutRoot'", 
      scenarioClass.Name), NotifyType.ErrorMessage); 
    } 
} 

Эти классы/страницы были тесно связаны с контролем UI (ListBox), но я вынул, так как ListBox не принадлежит в моей userflow.

Также в MainPage.xaml.cs:

// Change the array below to reflect the name of your scenarios. 
// This will be used to populate the list of scenarios on the main page with 
// which the user will choose the specific scenario that they are interested in. 
// These should be in the form: "Navigating to a web page". 
// The code in MainPage will take care of turning this into: "1) Navigating to a web page" 
List<Scenario> scenarios = new List<Scenario> 
{ 
    new Scenario() { Title = "Main Title", ClassType = typeof(TitleScreen) }, 
    new Scenario() { Title = "Images from a file stream", ClassType = typeof(Scenario2) }, 
    new Scenario() { Title = "Displaying a NineGrid image", ClassType = typeof(Scenario3) }, 
    new Scenario() { Title = "Using a WriteableBitmap", ClassType = typeof(Scenario4) } 
}; 

Должен ли я изменить класс сценариев для хранения инстанциации всех этих сценариев?

Или мне нужно настроить IPC для передачи информации обратно? Я не уверен, что Windows Apps может даже делать IPC.

ответ

0

Видимо класс MainPage имеет статическую ссылку на себя, так что я могу назвать, что для изменения вторичных страниц из вторичных страниц:

// in the secondary page: 
MainPage rootPage = MainPage.Current; 
rootPage.SetScreen(2); 

// definition in the MainPage class: 
public static MainPage Current; 
Смежные вопросы