2012-08-03 85 views
0

我想用這個簡單的代碼搜索任何可見的子窗口,但消息總是說找不到窗口。任何人都可以有關於在主窗口中搜索可見子窗口的想法嗎?找到可見子窗口

下面的代碼:

private HomeWindow NewHomeWindow = new HomeWindow(); 
string ReturnWindowName; 
private void btnhome_Click(object sender, RoutedEventArgs e) 
{ 
    ReturnWindowName = "NewHomeWindow"; 
    NewHomeWindow.Owner = this; 
    NewHomeWindow.Show(); 
} 

private void btnsearchwindow_Click(object sender, RoutedEventArgs e) 
{ 
    ChangeWindow(); 
} 

public void ChangeWindow() 
{ 
    Window mySearchWindow = (Window)this.FindName(ReturnWindowName); 

    if (mySearchWindow != null) 
    { 
     MessageBox.Show("Window Found"); 
    } 
    else 
    { 
     MessageBox.Show("Window Not Found"); 
    } 
} 

回答

0

由於您將所有權分配給您的Windows,您是否可以利用OwnedWindows屬性遍歷父項擁有的Windows來查找您正在查找的屬性?在進一步查看代碼時,您將創建一個名爲NewHomeWindow的類級別變量,但您沒有將任何內容分配給Name屬性,FindName正在搜索子元素,而不是擁有的窗口。如果你添加一個名字到你的窗口並使用這樣的東西,你應該能夠找到它。

public partial class MainWindow : Window 
{ 
    private HomeWindow NewHomeWindow = new HomeWindow(); 
    string ReturnWindowName; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     NewHomeWindow.Name="NewHomeWindow"; 
    } 

    private void btnhome_Click(object sender, RoutedEventArgs e) 
    { 
     ReturnWindowName = "NewHomeWindow"; 
     NewHomeWindow.Owner = this; 
     NewHomeWindow.Show(); 
    } 

    private void btnsearchwindow_Click(object sender, RoutedEventArgs e) 
    { 
     ChangeWindow(); 
    } 

    public void ChangeWindow() 
    { 
     foreach (Window w in this.OwnedWindows) 
     { 
      if (w.Name == ReturnWindowName) 
      { 
       MessageBox.Show("Window Found"); 
      } 
      else 
      { 
       MessageBox.Show("Window Not Found"); 
      } 
     } 
    } 
} 
0

我不能完全肯定你的問題,但我想你想找到一個控制的可視子?

這是我經常使用的一個輔助功能..

public 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; 
       } 
       } 
      } 
     } 

在你的榜樣,你會尋找一個窗口:

foreach (var window in FindVisualChildren<Window>(this)) 
{ 
    if (window.ReturnWindowName == <insertNameHere>) 
    return window; 
} 

從那裏,你可以依次通過窗口找到並匹配名稱。