Wpf Visual Brush Visual Binding to MediaElement

时间:2017-08-01 06:30:33

标签: c# wpf binding visualbrush

我有一个关于绑定到视觉画笔视觉的问题。如果我在XAML中定义它就可以了。如果我以编程方式定义相同的东西,那么它不起作用。这是一个例子。

 <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>

我尝试将以下属性作为视觉元素和媒体元素。

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

编辑3.我已经发现了绑定错误并且它已被绑定。它出现在Live Visual Tree / Live属性资源管理器中。它只是没有出现。

有谁知道为什么?

3 个答案:

答案 0 :(得分:1)

绑定Visuals和VisualBrushes时似乎存在问题。 在这种情况下,我建议以一种更适合MVVM分离的方式来解决问题。 而不是绑定Visual,在XAML中创建可视化并绑定到Visual的Source属性。 你的XAML将是:

<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>

你的代码背后:

public Uri MovieUri { get; set; }

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

        InitializeComponent();            
    }

答案 1 :(得分:0)

这似乎是因为您的Stuff属性未通知更改。 您有三种选择来解决这个问题:

1)在MainWindow类中实现INotifyPropertyChanged接口,并在设置Stuff属性时引发PropertyChanged事件。

2)将Stuff属性定义为具有固有属性更改通知的DependencyProperty(因为您的类是DependencyObject)

3)在调用InitializeComponent之前分配属性值。在初始化期间,这显然只能工作一次。

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

    InitializeComponent();
}

这是属性参与Binding游戏的两种可用方法

答案 2 :(得分:0)

不可能对包含媒体元素的任何东西使用绑定并让它发挥作用。

解决方法是为包含media元素的对象订阅视图模型属性已更改事件。当它更改时,您以编程方式添加对象。然后媒体元素将显示并播放。