我有一个关于绑定到视觉画笔视觉的问题。如果我在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属性资源管理器中。它只是没有出现。
有谁知道为什么?
答案 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元素的对象订阅视图模型属性已更改事件。当它更改时,您以编程方式添加对象。然后媒体元素将显示并播放。