有没有办法按名称引用WPF UI元素的子元素?

时间:2009-12-11 21:53:27

标签: .net wpf

我有一个非常简单的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通过类似

之类的DockPanel
DockPanel x = App.AppPrimeWindow.dockPanel1;

但深入挖掘似乎并不容易。我可以获得DockPanel的子节点的UIElementCollection,并且我可以通过整数索引获得单个子节点,但是从可维护性的角度来看,显然不是这样做的方法。

3 个答案:

答案 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
  }
}