C# MVVM открыть новое окно с медиаэлементом в качестве contentcontrol
У меня другая проблема с MVVM. Я хочу нажать на кнопку и новое окно, содержащее медиаэлемент в качестве управления контентом. Окно должно открыться и начать видео по ссылке, переданной конструктору. Вот мой соответствующий код:
ApplicationView.xaml:
<Window.Resources>
<DataTemplate DataType="{x:Type local:ApplicationViewModel}">
<local:ApplicationView/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:MediaPlayerViewModel}">
<local:MediaPlayerView/>
</DataTemplate>
</Window.Resources>
РЕДАКТИРОВАТЬ: Это также ничего не меняет, если я не использую UserControl... была попытка исправить предупреждение, которое я получил здесь.
Здесь я должен сказать, что получил предупреждение, но оно работает. Так как мои представления наследуются от Window, он говорит, что я не могу передать элемент окна элементу стиля. Не знаю, имеет ли это какое-то отношение к этому: P
MediaPlayerView.xaml:
<Grid HorizontalAlignment="Left" Width="500" Margin="0,0,-208,0" RenderTransformOrigin="0.50,0.50">
<ContentControl Content="{Binding MediaElementObject}"/>
</Grid>
Теперь я нашел много решений для открытия окна в шаблоне MVVM, но мне понравилось только одно, которое я пытался реализовать:
public class WindowHandler
{
public void ShowWindow(object dataContext, int height, int width)
{
Window window = new Window()
{
Content = dataContext,
Width = width,
Height = height
};
window.Show();
}
}
Код команды, связанной с моей кнопкой:
var windowHandler = new WindowHandler();
windowHandler.ShowWindow(new MediaPlayerViewModel(directLink), 500, 500);
И конструктор MediaPlayerViewModel это:
class MediaPlayerViewModel : INotifyPropertyChanged
{
private Uri mediaSource;
public MediaPlayerViewModel()
{
mediaElementObject = new MediaElement();
mediaElementObject.LoadedBehavior = MediaState.Manual;
mediaElementObject.MediaOpened += OnMediaOpened;
}
public MediaPlayerViewModel(string directLink) : this()
{
mediaSource = new Uri(directLink);
mediaElementObject.Source = mediaSource;
mediaElementObject.Play();
OnPropertyChanged("MediaElementObject");
}
/*...........*/
}
Последний мой MediaPlayerView.xaml.cs
public partial class MediaPlayerView : Window
{
private MediaPlayerViewModel viewModel;
public MediaPlayerView()
{
InitializeComponent();
viewModel = new MediaPlayerViewModel();
this.DataContext = viewModel;
}
}
РЕДАКТИРОВАТЬ: ничего не изменится, если я установлю
this.DataContext = viewModel;
или же
this.Content = viewModel;
но я думаю, что второй - это право идти сюда, верно?
Теперь, если я нажму мою кнопку на главном экране, откроется новое окно, но оно показывает только
myNamespace.MediaPlayerViewModel
вместо того, чтобы проигрывать мой mediaElement... Я думаю, что это как-то связано с управлением контентом, как упоминалось ранее, но я не знаю, как это исправить. Я имею в виду, если я не могу передать окно элементу стиля, что мне тогда передавать? Разве мое новое окно не должно наследовать от окна? И что означает это x:Type вещь в contentcontrol? Я прочитал кое-что о динамическом управлении контентом, но думаю, что мне это не нужно в моем новом окне.
Надеюсь, я написал понятный пост, и кто-то может мне помочь:)
РЕДАКТИРОВАТЬ: Ну, теперь я почти уверен, что моя проблема связана с тем, как я связываю свою ViewModel с моим View... Как я уже говорил и упоминал в комментариях, я пытался сделать так, как в Открытие нового окна в MVVM WPF, Но я думаю, что он не распознает связь с моей viewmodel с видом.... Но почему?:S
Если я правильно понял, мой WindowHandler с этим кодом
windowHandler.ShowWindow(new MediaPlayerViewModel(), 500, 500);
вызывает ShowWindow и создает новое окно с
Content = dataContext
Поскольку мы связали MediaPlayerViewModel с MediaPlayerView, он должен автоматически нарисовать правильное представление... но это не так: S
РЕДАКТИРОВАТЬ: Я до сих пор не знаю, почему это не сработало.... попробовал это сейчас с интерфейсом IWindowFactory, как в другом потоке здесь, чтобы создать вид и открыть окно, как обычно делают... Было бы лучше с таким подходом... может кто-нибудь может мне помочь когда-нибудь:D