如何从后面的用户控件代码访问用户控件所在的主窗口上的网格列

Posted

技术标签:

【中文标题】如何从后面的用户控件代码访问用户控件所在的主窗口上的网格列【英文标题】:How can i access grid column on the Main Window in which a User Control is located from the User Control Code Behind 【发布时间】:2021-12-18 13:31:36 【问题描述】:

我希望有人可以帮助我。

我在主窗口的一列中放置了一个用户控件,我希望访问列宽并从后面的用户控件代码中修改它。 如果我知道列的 x:name 如下所示,我可以实现这一点:

((MainWindow)System.Windows.Application.Current.MainWindow).ColumnName.Width = new GridLength(55, GridUnitType.Pixel);

我想知道,如果我不知道包含列的名称,有没有办法实现同样的事情?

用户控件需要最小和最大宽度,并且可以使用 GridSplitter 在这些限制内增加宽度。用户控件也可以固定打开或关闭到 55 的宽度。我能够实现这一点的唯一方法是设置主窗口的列宽、minWidth 和 MaxWidth。但是这些需要在用户控件关闭时进行修改。如果有更好的方法来实现这一点而无需了解包含网格,我会喜欢一些指针。

感谢您的帮助

【问题讨论】:

听起来是个坏主意。控件必须不知道它包含在网格列中这一事实。为什么它不设置自己的Width,并与Width="auto" 住在一个列中。 @Clemens 感谢您的及时回复。我在我的问题中添加了一些额外的细节,希望能澄清我的情况 【参考方案1】:

您应该可以使用FindVisualChild 来完成此操作,如here 所述。 但我认为如果有多个列,您将需要一些信息来过滤掉您的列。

通过网格检查你需要的类似这样的东西。

foreach (Grid grid in FindVisualChildren<Grid>(App.Current.MainWindow))

  foreach (ColumnDefinition item in grid.ColumnDefinitions)
  
    Console.WriteLine(item.Width);
  

【讨论】:

网格列不是视觉对象。 @Clemens 请检查编辑。这可能不是理想的方式。

以上是关于如何从后面的用户控件代码访问用户控件所在的主窗口上的网格列的主要内容,如果未能解决你的问题,请参考以下文章

从后面的子母版页代码访问子母版页上的用户控件

WPF,从用户控件中更新主窗口中的状态栏

如何修复错误从用户控件中的主窗体获取数据?

如何从 viewmodel 访问用户控件上的命令

如何重新访问之前在子控件中声明的用户控件?

c#如何从另一个窗口中更改主窗口控件的属性