【问题标题】:How can i access from code behind, controls that are in a stack panel?我如何从后面的代码访问堆栈面板中的控件?
【发布时间】:2012-07-04 11:23:39
【问题描述】:

这是在 WPF 中的 C# 中:

我知道我可以像这样将项目添加到堆栈面板:myStackPanel.Children.Add(new Button()); 或者像这样的 ListBox:myListBox.Items.Add(new Button()); 当然,我也可以先编辑控件,然后再添加,比如先设置属性再添加。

但是,一旦控件位于带有代码的堆栈布局中,我该如何选择它。比如有没有类似这样的方式:myStackPanel.Childern.CONTROL_AT_INDEX[n]?然后我如何编辑它,更像是更改标签的内容(如果它是标签)或事件处理程序(如果它是按钮)?

我也想要一个 ListBox 的解决方案。 我只是不知道如何访问这些控件。

【问题讨论】:

    标签: c# wpf listbox controls


    【解决方案1】:

    分配给该控件x:Name 并在您的代码中使用它。

    这对于 TemplatesStyles 中存在的控件自然无效。

    【讨论】:

    • 好吧,我要在运行时添加这些控件,所以我不能向它们添加 x:name 可以吗?我需要一种在没有 xaml 部分的帮助下访问这些控件的方法
    • 啊,如果您需要控制 在运行时,只需保留您创建的对象,或者给它们 Name 并通过 获取它们名称来自父控件。
    • 是的,但是我想与这些控件进行更多交互仍然太容易了,使用名称太简单了:P 没有办法将层次结构树向下传递到我想要的控件吗?
    • 您可以使用Visual Tree。但同样,它并不总是适用于 templatesstyles
    【解决方案2】:

    就像 Tigran 已经发布的一样,可以在 XAML 中为您的控件分配一个属性:

    <ListBox x:Name="myListBox"
             // more properties here...
    />
    

    然后您的代码隐藏将能够编译您的行:

    myListBox.Items.Add(new Button());
    

    但是,我强烈建议您交替使用 MVVM 方法来摆脱代码隐藏文件。这减少了您的业务逻辑与 UI 的耦合。使用 MVVM 模式是微软推荐的使用 WPF 的方式,因为它使得使用许多 WPF 功能变得非常容易。

    可以在这个 SO 线程中找到很好的教程资源,例如:MVVM: Tutorial from start to finish?

    【讨论】:

      【解决方案3】:

      这是我的解决方案

      var child = (from c in theCanvas.Children
               where "someId".Equals(c.Tag)
               select c).First();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多