我找到了从usercontrol访问主窗口的方法:
我有一些问题:
谢谢, 跳过我糟糕的英语:)
答案 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.MainWindow
或Window.GetWindow(this)
:
因为你打破了常见的设计模式和规则(比如“主要依赖性倒置”或MVVM)而不好,
在编码XAML转换器(直接处理UI的元素)时,使用VisualTreeHelper
有时很有用。因为你强烈依赖你的xaml可视化树,所以在代码中不可取。
如果您想在MainWindow
和UserControl
之间进行通信,为其他程序集保留可恢复的UserControl
,请在您的Usercontrol中添加一个或多个dependency properties,然后设置Xaml中的绑定。
如果您想要快速简便的测试应用程序,请确保Application.Current.MainWindow仍然是一个不错的选择。