从主窗口进行内容控制中的访问控制

时间:2014-12-02 02:16:35

标签: c# wpf

我找到了从usercontrol访问主窗口的方法:

  • Window parentWindow = Window.GetWindow(this);
  • DependencyObject parentWindow = VisualTreeHelper.GetParent(child);
  • Application.Current.MainWindow as parentWindow;

我有一些问题:

  1. 上述哪种方法最好?
  2. 如何在主窗口中从usercontrol访问控件,在同一主窗口中从usercontrol访问usercontrol?
  3. 谢谢, 跳过我糟糕的英语:)

2 个答案:

答案 0 :(得分:2)

Current.MainWindow在所有情况下都是理想的,因为如果UserControl嵌入在另一个UserControl中,您仍然可以使用Current.MainWindow遍历树。所有的方法都很好,这完全取决于使用情况和你想要完成的事情。

要在UserControl内访问控件(例如 TextBlock )。

TextBlock tb = FindVisualChildren<TextBlock>(usercontrol)

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

答案 1 :(得分:1)

所有建议都不是“最佳”:

Application.Current.MainWindowWindow.GetWindow(this): 因为你打破了常见的设计模式和规则(比如“主要依赖性倒置”或MVVM)而不好,

在编码XAML转换器(直接处理UI的元素)时,使用VisualTreeHelper有时很有用。因为你强烈依赖你的xaml可视化树,所以在代码中不可取。

如果您想在MainWindowUserControl之间进行通信,为其他程序集保留可恢复的UserControl,请在您的Usercontrol中添加一个或多个dependency properties,然后设置Xaml中的绑定。

如果您想要快速简便的测试应用程序,请确保Application.Current.MainWindow仍然是一个不错的选择。