如何访问Frame的子元素?

本文关键字:元素 Frame 何访问 访问 | 更新日期: 2023-09-27 17:54:03

我的主窗口中有一些框架根据用户输入设置为可见/折叠:

<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>

输入。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;
}

在这个主窗口中,顶部有一个菜单,允许保存和打开文件。当我打开文件时,我希望读取数据(我能够成功地做到这一点),并读取输入中的UI。要更新的Xaml文件

以下代码在inputs . example .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调用这个函数,因为这是Open File事件的事件处理程序所在的位置:

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()不会更新输入中的GUI。xaml页面。我最初在我的MainWindow中有这样的东西:

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

我知道问题是我为Inputs创建了一个新对象,这可能就是它不工作的原因。我不确定如何做到这一点,这样我就不用一个新的对象-想知道我是否可以使用InputsFrame的某种方式。我还尝试使用事件处理程序,但没有成功。

如何访问Frame的子元素?

如果您想与Frame元素中的Inputs对象交互,则需要检索该对象,而不是创建新对象。

你可以这样做:

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

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