C# 主窗口内容控制中的访问控制

C# 主窗口内容控制中的访问控制,c#,wpf,C#,Wpf,我找到了从usercontrol访问主窗口的方法: Window parentWindow=Window.GetWindow(此) DependencyObject parentWindow=VisualTreeHelper.GetParent(子级) Application.Current.MainWindow作为父窗口 我有一些问题: 以上哪种方法最好 如何从主窗口访问usercontrol中的控件,以及如何在同一主窗口中从usercontrol访问usercontrol中的控件 谢谢,

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

  • Window parentWindow=Window.GetWindow(此)
  • DependencyObject parentWindow=VisualTreeHelper.GetParent(子级)
  • Application.Current.MainWindow作为父窗口
我有一些问题:

  • 以上哪种方法最好
  • 如何从主窗口访问usercontrol中的控件,以及如何在同一主窗口中从usercontrol访问usercontrol中的控件
  • 谢谢,
    跳过我糟糕的英语:)

    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;
                }
            }
        }
    }
    
    TextBlock=FindVisualChildren(用户控制)
    公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
    {
    if(depObj!=null)
    {
    for(int i=0;i
    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;
                }
            }
        }
    }
    
    TextBlock=FindVisualChildren(用户控制)
    公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
    {
    if(depObj!=null)
    {
    for(int i=0;i
    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;
                }
            }
        }
    }
    
    TextBlock=FindVisualChildren(用户控制)
    公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
    {
    if(depObj!=null)
    {
    for(int i=0;i
    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;
                }
            }
        }
    }
    
    TextBlock=FindVisualChildren(用户控制)
    公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
    {
    if(depObj!=null)
    {
    for(int i=0;i
    建议中没有一个是“最好的”:

    Application.Current.MainWindow
    Window.GetWindow(此)
    : 不太好,因为您违反了常见的设计模式和规则(如“原则依赖倒置”或MVVM)

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

    如果要在
    主窗口
    用户控件
    之间通信,为其他程序集保留可恢复的
    用户控件
    ,请向用户控件添加一个或多个,并在Xaml中设置绑定

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

    建议的所有应用程序都不是“最佳”:

    Application.Current.MainWindow
    Window.GetWindow(此)
    : 不太好,因为您违反了常见的设计模式和规则(如“原则依赖倒置”或MVVM)

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

    如果你想要c