我有一个非常简单的app.xaml.cs,当应用程序启动时,会创建一个新的PrimeWindow,并使其可以被外部访问。
public partial class App : Application
{
public static PrimeWindow AppPrimeWindow { get; set; }
private void Application_Startup(object sender, StartupEventArgs e)
{
AppPrimeWindow = new PrimeWindow();
AppPrimeWindow.Show();
}
}
PrimeWindow的xaml如下所示:
<Window x:Class="WpfApplication1.PrimeWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="500" Width="500"
xmlns:MyControls="clr-namespace:WpfApplication1">
<DockPanel Name="dockPanel1" VerticalAlignment="Top">
<MyControls:ContentArea x:Name="MyContentArea" />
</DockPanel>
</Window>
作为一个完整的WPF新手,我无疑会搞砸几件事,但当下的问题是:我如何在其他地方的代码中引用内容区?我很容易得到ahold通过类似
之类的DockPanelDockPanel x = App.AppPrimeWindow.dockPanel1;
但深入挖掘似乎并不容易。我可以获得DockPanel的子节点的UIElementCollection,并且我可以通过整数索引获得单个子节点,但是从可维护性的角度来看,显然不是这样做的方法。
答案 0 :(得分:4)
非常简单,
ContentArea contentArea = dockpanel1.FindName("MyContentArea") as ContentArea;
答案 1 :(得分:1)
...
<DockPanel Name="dockPanel1" x:FieldModifier="Public" VerticalAlignment="Top">
...
这会使dockPanel1
字段公开,因此可以从其他类
请注意,这不是很好的做法,因为它打破了封装...您还可以将DockPanel
公开为代码隐藏中定义的公共属性
答案 2 :(得分:1)
如果你需要引用孩子,那么通过UIElementCollection
就可以了。如果您只是想访问MyContentArea,那么没有什么可以阻止您执行以下操作:
MyControls.ContentArea = App.AppPrimeWindow.myContentArea;
如果您需要动态查看DockPanel中是否有ContentArea,以下内容将起作用:
DockPanel dock = App.AppPrimeWindow.dockPanel1;
for (int i = 0; i < dock.Children.Count; i++)
{
if (dock.Children[i] is ContentArea) // Checking the type
{
ContentArea ca = (ContentArea)dock.Children[i];
// logic here
// return;/break; if you're only processing a single ContentArea
}
}