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