/ / Wpf Visual Brush Associazione visiva a MediaElement - c #, wpf, binding, visualbrush

Wpf Visual Brush Visual Binding a MediaElement - c #, wpf, binding, visualbrush

Ho una domanda sull'associazione a un visual visual visivo. Se lo definisco in XAML funziona. Se definisco la stessa cosa a livello di programmazione, allora non funziona. Ecco un esempio.

 <Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="MyWindow"
Title="MainWindow" Height="350" Width="525">
<Grid >
<Rectangle Height="299" Width="400" Stroke="Red" StrokeThickness="20" >
<Rectangle.Fill>
<VisualBrush TileMode="None" Stretch="UniformToFill" Visual="{Binding  ElementName=MyWindow, Path=Stuff}">
<!--<VisualBrush.Visual>
<MediaElement Source="MovingImages_2017-03-10-05-02-22.wmv" LoadedBehavior="Play" />
</VisualBrush.Visual>-->
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Window>

Ho provato la seguente proprietà come elemento visivo e multimediale.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApp1
{
public partial class MainWindow : Window
{
public Visual Stuff { get; set; }

public MainWindow()
{
InitializeComponent();

MediaElement me = new MediaElement();
me.Source = new Uri("MovingImages_2017-03-10-05-02-22.wmv", UriKind.Relative);
me.LoadedBehavior = MediaState.Play;


this.Stuff = (Visual) me;
}
}
}

Modifica 3. Ho rilevato errori di associazione ed è stato associato. Viene visualizzato nella struttura Live Visual Tree / Live Explorer. Semplicemente non si presenta.

Qualcuno sa perché?

risposte:

1 per risposta № 1

Sembra esserci un problema durante l'associazione di Visuale VisualBrushes. In questo caso, suggerirei di seguire il problema in un modo che si adatti anche alla migliore separazione MVVM. Invece di associare una visuale, creare la visuale in XAML e collegarla alla proprietà Source di Visual. Il tuo XAML sarebbe:

<Rectangle Height="299" Width="400" Stroke="Red" StrokeThickness="20">
<Rectangle.Fill>
<VisualBrush TileMode="None" Stretch="UniformToFill">
<VisualBrush.Visual>
<MediaElement Source="{Binding Path=MovieUri, ElementName=MyWindow}" LoadedBehavior="Play" />
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>

E il tuo codice dietro:

public Uri MovieUri { get; set; }

public MainWindow()
{
MovieUri = new Uri("movie.mp4", UriKind.Relative);

InitializeComponent();
}

0 per risposta № 2

Sembra che questo sia dovuto al tuo Stuff la proprietà non notifica la modifica. Hai tre opzioni per risolvere questo:

1) Implementare l'interfaccia INotifyPropertyChanged nella classe MainWindow e quando si imposta il Stuff proprietà aumentare l'evento PropertyChanged.

2) Definisci il Stuff proprietà come DependencyProperty che ha intrinseche notifiche di modifica delle proprietà (poiché la classe è un DependencyObject)

3) Assegna il valore della proprietà prima di chiamare InitializeComponent. Questo ovviamente funzionerà solo una volta durante l'inizializzazione.

public MainWindow()
{
Stuff = new MediaElement
{
Source = new Uri("MovingImages_2017-03-10-05-02-22.wmv", UriKind.Relative),
LoadedBehavior = MediaState.Play
};

InitializeComponent();
}

Questi sono i due metodi disponibili per una proprietà per partecipare al gioco Binding


0 per risposta № 3

Non è possibile utilizzare un'associazione a tutto ciò che contiene un elemento multimediale e farlo giocare.

Una soluzione alternativa è la sottoscrizione al modello di visualizzazioneevento modificato proprietà per l'oggetto che contiene l'elemento multimediale. Quando cambia, aggiungi l'oggetto a livello di codice. Quindi l'elemento multimediale verrà visualizzato e riprodotto.