我使用WPF / C#创建了一个视频播放器窗口,其中包含一些部件,一个显示器,一个滑块和一些播放器按钮,如下图所示:
因为如果所有用户控件对象都是用单个.xaml编写的,那么该文件将很大并且难以编辑。所以我将控制对象分成几个不同的.xaml文件,例如,我定义了一个包含所有播放器按钮的
public partial class player_control : UserControl
。但是现在我不知道如何将来自此UserControl的消息传递给其他控件,例如滑块player_slider
。通常,如果我们点击下一帧的按钮,将触发函数player_slider.ValueChange
,但我不知道如何实现这种函数。
我是WPF / C#的新手,请帮我解决这个问题。
答案 0 :(得分:1)
我要做的是在Player控件中定义消息,每个按钮一个:
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
&amp; PlayerButtons_Stop
方法。
答案 1 :(得分:0)
有多种方法可以实现这一点。例如,我们可以公开公共财产和每个控件中的方法。然后从实例变量访问这些方法以发送消息。此外,我们可以在应用程序级别类中保留这些自定义控件的引用,以便于访问。
或者,我们也可以实现发布者/订阅者模型。每个控件都可以订阅特定的通知事件,并根据其功能引发事件。
答案 2 :(得分:0)
从您所使用的应用程序类型中我将猜测您需要跨不同用户控件处理事件而不是共享属性。因为根据你的截图,你将需要处理Play / Pause,Stop,Next,Back等......事件。
对于那种情况,我最好的选择是中介模式,你可以搜索它以便更好地理解。简而言之,将有一个介体坐在其间,两个控件将使用它们相互通信。
介体模式的参考。 http://code.msdn.microsoft.com/windowsdesktop/The-Mediator-Pattern-c2c07b54
答案 3 :(得分:0)
与其他控件一样,您可以通过依赖项属性访问属性。您可以通过其Value属性(如<Slider Value={Binding MySliderValueProperty} .. />
要做同样的事情,您可以在DependencyProperty
中创建自己的player_control
,然后绑定到该public static DependencyProperty SliderValueProperty =
DependencyProperty.Register("SliderValue", typeof(double), typeof(player_control), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
。
<controls:player_control SliderValue={Binding MySliderValueProperty} ../>
然后在您的视图中将其绑定
public string MySliderValueProperty
{
get { return m_SliderValue; }
set
{
if (m_SliderValue == value)
return;
// here we have an updated value
m_SliderValue = value;
RaisePropertyChanged(() => MySliderValueProperty);
}
}
“Value Changed”将出现在绑定属性的setter中,就像常规的Slider一样
SliderValue
然后将它与作为实际滑块的控件连接起来,以便将该值连接到{{1}}。