2015-06-07 60 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