使用后面的代码创建和显示控件

时间:2011-09-17 15:30:55

标签: c# wpf xaml binding code-behind

对于我的一个WPF项目,我需要整合VLC播放器,我一直在玩这个Codeplex Project

的示例应用程序

但是我需要在运行时创建多个播放器控件的实例并显示它设置其各种属性。播放器实例的数量取决于用户选择。

我正在尝试将示例应用程序中给出的XAML转换为其后面的等效代码。

<Wpf:VlcControl x:Name="myVlcControl" />

<Grid Grid.Row="0">
     <Grid.Background>
         <VisualBrush Stretch="Uniform">
             <VisualBrush.Visual>
                 <Image Source="{Binding ElementName=myVlcControl, Path=VideoSource}" />
             </VisualBrush.Visual>
         </VisualBrush >
    </Grid.Background>
</Grid> 

这是我到目前为止所做的事情

编辑:陈金诺回答后的代码更新,但问题仍然存在。

    Grid g = new Grid();
    VlcControl p = new VlcControl();

    p.Media = new PathMedia(@"C:\movie.mkv");

    VisualBrush vbr = new VisualBrush();
    g.Background = vbr;

    vbr.Stretch = Stretch.Uniform;

    Binding binding = new Binding("VideoSource");
    binding.ElementName = "p";
    Image img = new Image();
    img.SetBinding(Image.SourceProperty, binding);

    vbr.Visual = img;
    g.Children.Add(p);                       
    this.grid1.Children.Add(g);
    p.Play();

上面的代码背后,当我运行应用程序时,我可以听到电影声音,但看不到它。我在后面的代码中缺少Image Binding(elementname和path),但不知道该怎么做。

有人能指点我一些文档(谷歌搜索没有产生任何好结果)或提供指针将XAMl中的Binding转换为其后面的等效代码?

非常感谢

2 个答案:

答案 0 :(得分:1)

        Binding binding = new Binding("VideoSource");
        binding.ElementName = "myVlcControl";
        Image img = new Image();
        img.SetBinding(Image.SourceProperty, binding);

答案 1 :(得分:1)

我知道这个问题已经过时了,但我遇到了同样的问题,并考虑分享解决方案。

实际上Chen Kinnrot的答案非常完整,唯一需要的是修复绑定。

而不是:

binding.ElementName = "myVlcControl";

它应该是:

binding.Source = p; // p - the instance of the VlcControl

并结合陈代码:

Binding binding = new Binding("VideoSource");
binding.Source = p;
Image img = new Image();
img.SetBinding(Image.SourceProperty, binding);