Как обратиться к элементу MainWindow из кода страницы (Page) WPF?
Здравствуйте. У меня есть окно MainWindow, внутри находится Frame, в котором и отображаются страницы. При определенном действии на странице мне необходимо менять элемент принадлежащий MainWindow. Долго искал, но так и не нашел решения. Я только изучаю wpf, подскажите возможные альтернативы, если это невозможно.
Если кратко это простенький аудиоплеер:
Есть страница с плейлистами (Там просто DataGrid)
При выборе плейлиста в Frame отображается страница с аудиофайлами (тоже DataGrid).
Собственно, при выборе аудиофайла необходимо начать воспроизведение, но все элементы управления (кнопки Играть/Пауза/Стоп и Slider, отображающий прогресс) находятся вне страницы, в главном окне (сделано это, чтобы при переходе между страницами воспроизведение выбранного аудиофайла не прекращалось). Проблема в том, что обработчику события выбора аудиофайла (который находится в файле отдельного кода страницы) необходимо взаимодействовать с элементами, которые находятся вне страницы. Возможно это следствие плохого проектирования, но все-таки хочется доделать хоть так. Заранее спасибо
Самый простой способ добраться до MainWindow это: Application.Current.MainWindow
Но все зависит от шаблона проектирования вашего приложения, для примера при MVVM могут быть и другие решения.
Петр, В MainWindow у меня есть <TextBlock x:Name="audioName"></TextBlock>
В нем отображается название проигрываемого аудиофайла.
На странице с аудиофайлами есть
<DataGrid x:Name="audioFileList">
...
</DataGrid>
В файле отдельного кода страницы:
private void audioFileList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
...
Application.Current.MainWindow.audioName.Text = audio_name;
// (audio_name содержит название файла)
}
VS: "Window" не содержит определения "audioName", и не удалось найти доступный метод расширения "audioName", принимающий тип "Window" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
Владислав Дюжев, Application.Current.MainWindow вам отдает обьект типа Window, а ваше окно типа MainWindow, то есть наследник. Вот и приведите к нужному типу Application.Current.MainWindow as MainWindow