2014-02-18 69 views
0

我创建使用WPF/C#中的视频播放器窗口,其中包含一些部件,监视器,一个滑块和一些播放器按钮,就像下面的图像显示:传送消息

enter image description here 因为如果所有的用户控件对象都被写入一个.xaml文件将会很大并且难以编辑。所以我将控制对象分成几个不同的.xaml文件,例如,我定义了一个包含所有播放器按钮的public partial class player_control : UserControl。但是现在我不知道如何将消息从这个UserControl传递到其他控件,例如滑块player_slider。通常,如果我们点击下一帧的按钮,功能player_slider.ValueChange将被触发,但我不知道如何实现这种功能。

我是WPF/C#的新手,请帮助我解决这个问题。

+0

去下载Prism并使用EventAggregator ... http://compositewpf.codeplex.com/ –

回答

0

有多种方式可以实现这一点。例如,我们可以在每个控件中公开属性&方法。然后从实例变量中访问这些方法来发送消息。此外,我们可以将这些自定义控件的引用保留在应用程序级别类中,以便于访问。

或者,我们也可以实现发布者/订户模型。每个控件都可以订阅特定的通知事件,并根据其功能引发事件。

0

从您正在使用的应用程序的种类中,我会猜测您需要处理跨不同用户控件的事件,而不是共享属性。因为从你在屏幕截图中你会想要处理播放/暂停,停止,下一个,后退等事件。

对于这种情况下,我最好的选择是中介模式,你可以搜索以获得更好的理解。简而言之,将会有一个调解员坐在其间,两个控件将使用这两个控件来相互沟通。

Mediator Pattern的参考。 http://code.msdn.microsoft.com/windowsdesktop/The-Mediator-Pattern-c2c07b54

1

我会做的是在播放器控件定义的消息,每一个按钮:

public static readonly RoutedEvent PlayEvent = EventManager.RegisterEvent("Play", . . .); 

public event RoutedEventHandler Play { 
    add { AddHandler(PlayEvent, value); } 
    remove { RemoveHandler(PlayEvent, value); } 
} 

public static readonly RoutedEvent StopEvent = EventManager.RegisterEvent("Stop", . . .); 

public event RoutedEventHandler Stop { 
    add { AddHandler(StopEvent, value); } 
    remove { Removehandler(StopEvent, value); } 
} 

. . . 

那么任何其他控制需要当用户点击按钮的一个做一些事情只是需要订阅的事件:

<local:PlayerButtons Play="PlayerButtons_Play" Stop="PlayerButtons_Stop" /> 

之后,你可以把你需要到PlayerButtons_Play & PlayerButtons_Stop方法的任何代码。

0

与其他控件一样,您可以通过依赖属性访问属性。你可以通过它的Value属性绑定到一个滑块值一样<Slider Value={Binding MySliderValueProperty} .. />

要做到,你可以创建你一样在你player_control然后你可以绑定到自己的DependencyProperty

public static DependencyProperty SliderValueProperty = 
    DependencyProperty.Register("SliderValue", typeof(double), typeof(player_control), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 
在你看来

然后将它绑定

<controls:player_control SliderValue={Binding MySliderValueProperty} ../> 

那么“值改为”将是你的绑定属性的setter方法,就像一个普通的滑盖

public string MySliderValueProperty 
{ 
    get { return m_SliderValue; } 
    set 
    { 
     if (m_SliderValue == value) 
      return; 

     // here we have an updated value 
     m_SliderValue = value; 
     RaisePropertyChanged(() => MySliderValueProperty); 
    } 
} 

这是然后将它与控制器连接起来,该控制器是实际的滑块,以便将该值连接到SliderValue