如何访问框架的子元素?
How do I access the child element of a Frame?
我的主 window 中有框架,根据用户输入设置为 visible/collapsed:
<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;
}
在这个主 window 中,顶部有一个菜单,用于保存和打开文件。当我打开文件时,我希望读取数据(我能够成功完成)并且还希望更新 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
事件)。但是,我需要从 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
。我也尝试过使用事件处理程序但没有成功。
如果您想与 Frame
元素中的 Inputs
对象交互,您需要检索那个对象,而不是创建一个新对象。
你可以这样做:
((Inputs)InputsFrame.Content).LoadValues();
即Frame
returns 的 Contents
属性 对用于填充 Frame
的 Inputs
对象的引用。只需将其转换为 Inputs
即可访问 class 的适当成员,例如 LoadValues()
.
我的主 window 中有框架,根据用户输入设置为 visible/collapsed:
<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;
}
在这个主 window 中,顶部有一个菜单,用于保存和打开文件。当我打开文件时,我希望读取数据(我能够成功完成)并且还希望更新 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
事件)。但是,我需要从 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
。我也尝试过使用事件处理程序但没有成功。
如果您想与 Frame
元素中的 Inputs
对象交互,您需要检索那个对象,而不是创建一个新对象。
你可以这样做:
((Inputs)InputsFrame.Content).LoadValues();
即Frame
returns 的 Contents
属性 对用于填充 Frame
的 Inputs
对象的引用。只需将其转换为 Inputs
即可访问 class 的适当成员,例如 LoadValues()
.