2015-06-07 98 views
2

我在我的主窗框,其被設置爲可見/摺疊基於用戶輸入:如何訪問框架的子元素?

<Grid> 
    <ScrollViewer x:Name="ScrollViewer1" Grid.Row="1" Grid.ColumnSpan="3" Margin="10,0,0,0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
      <Frame Name="InputsFrame" Source="Inputs.xaml" NavigationUIVisibility="Hidden" Visibility="Visible" 
        ScrollViewer.CanContentScroll="True" /> 
    </ScrollViewer> 

    <ScrollViewer x:Name="ScrollViewer2" Grid.Row="1" Grid.ColumnSpan="3" Margin="10,0,0,0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Visibility="Collapsed"> 
     <Frame Name="LoadCasesFrame" Source="LoadCases.xaml" NavigationUIVisibility="Hidden" Visibility="Collapsed" 
        ScrollViewer.CanContentScroll="True" /> 
    </ScrollViewer> 

    <!-- etc --> 

</Grid> 

的Inputs.xaml幀基本上只是由一個第三方DoubleTextBox控制的(在他們的100),和用戶可以輸入該頁面的值。後面的C#代碼:

private void InputsTab_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    LoadCasesFrame.Visibility = Visibility.Collapsed; 
    ScrollViewer2.Visibility = Visibility.Collapsed; 

    InputsFrame.Visibility = Visibility.Visible; 
    ScrollViewer1.Visibility = Visibility.Visible; 
} 

在這個主窗口中,在頂部有一個菜單允許保存和打開文件。當我打開文件時,我想要讀取數據(我可以成功完成)以及Inputs.xaml文件中的UI以進行更新。

下面的代碼是在Inputs.xaml.cs:

public void LoadValues() 
{ 
    List<DoubleTextBox> dtb1 = App.GetLogicalChildCollection<DoubleTextBox>(inputsGrid); 

    for (int i = 0; i < dtb1.Count; i++) 
    { 
     foreach (var keyValuePair in App.globalDictionary) 
     { 
      var doubleTextBox = dtb1[i] as DoubleTextBox; 

      if (doubleTextBox.Name == keyValuePair.Key) 
      { 
       doubleTextBox.Value = 500; 
       break; 
      } 
     } 
    } 
} 

此功能(所有的GUI更新到500的值),當我把它從Inputs.xml.cs頁面(例如,當我把它放在Page_Loaded事件中)。但是,我需要從MainWindow調用這個函數,因爲這是爲打開文件事件的事件處理程序位於:

private void openProject_Click(object sender, RoutedEventArgs e) 
{ 
    OpenFileDialog openFileDialog = new OpenFileDialog(); 
    if (openFileDialog.ShowDialog() == true) 
    { 
     string stringToDeserialize = File.ReadAllText(openFileDialog.FileName); 
     App.DeserializeJSONString(stringToDeserialize); 
    } 

    // call LoadValues here 
} 

以上調用LoadValues()不更新的Input.xaml頁的GUI。我本來在我的MainWindow是這樣的:

Inputs _inputs = new Inputs(); 
_inputs.LoadValues(); 

我知道,問題是,我創建了一個新的對象Inputs那可能是爲什麼它不工作。我不確定如何去做,所以我不使用新的對象 - 不知道我是否可以使用InputsFrame。我也嘗試過使用事件處理程序來取得成功。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

爲了將來的參考,請嘗試將問題描述限制爲只理解問題所需的基本要素,並確保問題標題準確地描述了手邊的_primary_問題(而不是像您嘗試的某種特定的解決方法策略) 。在上文中,我相信有關文件開放的討論是不相關的;它只是模糊了被問到的主要問題。 –

+0

JohnSaunders&@PeterDuniho:感謝您的評論和編輯。我試圖儘可能清楚和簡單。我將銘記未來的問題。 – greentea

回答

1

如果您想要與Frame元素中的Inputs對象進行交互,您需要檢索該對象,而不是創建一個新對象。

可以是這樣做的:

((Inputs)InputsFrame.Content).LoadValues(); 

FrameContents屬性返回對用於填充FrameInputs對象的引用。只需將其轉換爲Inputs即可訪問該類的相應成員,例如LoadValues()

+0

謝謝彼得。這很有魅力。不知道可以用這種方式訪問​​框架。 – greentea