【问题标题】:How do I access the child element of a Frame?如何访问 Frame 的子元素?
【发布时间】:2015-08-21 17:11:09
【问题描述】:

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

<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 框架基本上只包含一个第 3 方 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。我也尝试过使用事件处理程序,但没有成功。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 为了将来参考,请尽量将问题描述限制在理解问题所需的基本要点,并确保问题标题准确描述手头的主要问题(而不是例如您尝试过的解决方法的某些特定策略)。在上面,我确信关于文件打开的讨论是无关紧要的;它只会掩盖被问到的主要问题。
  • JohnSaunders 和@PeterDuniho:感谢您的 cmets 和编辑。我尽量做到清晰和简单。对于以后的问题,我会记住您的建议。

标签: c# wpf xaml event-handling frame


【解决方案1】:

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

你可以这样做:

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

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

【讨论】:

  • 谢谢你,彼得。这很有魅力。不知道可以通过这种方式访问​​帧。
猜你喜欢
  • 2023-03-26
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多