如何访问 Frame 的子元素?

3
我有一些在主窗口中的框架,根据用户输入设置为可见/折叠状态:
<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;
            }
        }
    }
}

当我从 Inputs.xml.cs 页面调用此函数时(例如,在 Page_Loaded 事件中放置它时),此函数将正常工作(GUI 中的所有值都更新为 500)。但是,我需要从 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。我还尝试使用事件处理程序,但没有成功。


我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
为了以后的参考,请尽量将问题描述限制在理解问题所需的基本要素,并确保问题标题准确描述了主要问题(而不是例如您尝试的某些特定工作-around策略)。在上述情况中,我有信心认为关于文件打开的讨论并不相关;它只会掩盖所提出的主要问题。 - Peter Duniho
JohnSaunders和@PeterDuniho:感谢您的评论和编辑。我尽力让自己的问题清晰简单。我会记住您的建议,以备将来之需。 - greentea
1个回答

2

如果你想与位于Frame元素中的Inputs对象进行交互,需要检索该对象,而不是创建一个新的。

你可以像这样操作:

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

也就是说,FrameContents属性返回一个引用到用于填充FrameInputs对象。只需将其强制转换为Inputs即可访问该类的适当成员,例如LoadValues()


谢谢你,Peter。这个方法非常有效。我以前不知道可以用这种方式访问frame。 - greentea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接