2017-06-20 92 views
0

是否有另一種方式來訪問MainWindowpublic變量比:如何訪問主窗口中的變量來自第二個窗口

MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault(); 
mainWindow.variable.... 

這項工作很好,但我創建一個WPF應用和集成USB Webcam到我的項目並使用上面的代碼訪問MainWindow的變量。這會導致一些問題,例如當我關閉MainWindow時程序仍在運行,並且相機不會停止。 有什麼建議嗎?

+0

爲什麼你想要訪問父窗口的公共屬性?如果有一些數據需要由其中的兩個訪問,則這些數據應該確實位於其他對象中,可供這兩個對象使用,或者由父對象傳遞給子窗口。看看mvvm模式。 –

+0

我的設置面板在我的MainWindow和設置面板(組合框和標籤)中的幾個控件。我試圖檢查選擇了哪個組合框的索引(在我的SecondWindow中) – TestMan

+0

然後創建一些類,它將保存您需要的數據稱爲「ControlData」。在其中放置一些屬性並從MainWindow更新它們。將這個類傳遞給子窗口,以便他可以訪問這些屬性 –

回答

0

這個我這是我在評論中寫的一個簡單的例子(你真的應該看看mvvm下面的例子是而不是 mvvm)。

public class SelectedIndexData 
{ 
    public int SelectedIndex { get; set; } 
} 

public partial class MainWindow : Window 
{ 

    private readonly SelectedIndexData _selectedIndexData = new SelectedIndexData(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void ComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     _selectedIndexData.SelectedIndex = ComboBox.SelectedIndex; 
    } 


    private void ShowChildWindow(object sender, RoutedEventArgs e) 
    { 
     new ChildWindow(_selectedIndexData).Show(); 
    } 
} 

public partial class ChildWindow : Window 
{ 
    private SelectedIndexData _selectedIndexData; 
    public ChildWindow(SelectedIndexData selectedIndexData) 
    { 
     InitializeComponent(); 
     _selectedIndexData = selectedIndexData; // do whatever you want with your data here 

    } 
} 
0

這種方法工作還,如果你正在開發一個DLL(你不能告訴Application.Current.MainWindow,這是更清晰那麼你嘗試反正一樣)

DependencyObject ucParent = this.Parent; 
     while (!(ucParent is MainWindow)) 

     { 
      ucParent = LogicalTreeHelper.GetParent(ucParent); 
     } 
     mainview = ucParent as MainWindow; 

您可以打包這裏面一個方法,節省您需要的變量,當主窗口被關閉,你應該不會有問題

0

爲了確保您的應用程序關閉:

public MainWindow() 
    { 
     InitializeComponent(); 
     this.Closing += (sender, args) => Application.Current.Shutdown(); 
    }