C# 在WPF/C中的不同用户控件之间传输消息#
我使用WPF/C#创建了一个视频播放器窗口,其中包含一些部件、一个监视器、一个滑块和一些播放器按钮,如下图所示: 因为如果所有的用户控件对象都写在一个.xaml中,那么这个文件就会很大,很难编辑。因此,我将控件对象拆分为几个不同的.xaml文件,例如,我定义了一个C# 在WPF/C中的不同用户控件之间传输消息#,c#,wpf,xaml,C#,Wpf,Xaml,我使用WPF/C#创建了一个视频播放器窗口,其中包含一些部件、一个监视器、一个滑块和一些播放器按钮,如下图所示: 因为如果所有的用户控件对象都写在一个.xaml中,那么这个文件就会很大,很难编辑。因此,我将控件对象拆分为几个不同的.xaml文件,例如,我定义了一个公共部分类player\u control:UserControl,其中包含所有player按钮。但是现在我不知道如何将消息从这个用户控件传递到其他控件,例如滑块player\u滑块。通常,如果我们点击下一帧的按钮,就会触发函数pla
公共部分类player\u control:UserControl
,其中包含所有player按钮。但是现在我不知道如何将消息从这个用户控件传递到其他控件,例如滑块player\u滑块
。通常,如果我们点击下一帧的按钮,就会触发函数player\u slider.ValueChange
,但我不知道如何实现这种函数
我是WPF/C的新手,请帮我回答这个问题。有多种方法可以实现这一点。例如,我们可以在每个控件中公开公共属性和方法。然后从实例变量访问这些方法以发送消息。此外,我们还可以在应用程序级类中保留这些自定义控件的引用,以便于访问
或者,我们也可以实现发布者/订阅者模型。其中,每个控件都可以订阅特定的事件以获取通知,还可以根据其功能引发事件。根据您使用的应用程序类型,我猜您需要跨不同的用户控件处理事件,而不是共享属性。因为根据你截图中的内容,你需要处理播放/暂停、停止、下一步、返回等。。。事件跨越 对于这种情况,我的最佳选择是中介模式,您可以搜索它以获得更好的理解。简言之,中间将有一个调解人,您的两个控件将使用该调解人彼此通信 中介模式的参考。
我要做的是在播放器控件中定义消息,每个按钮对应一条消息:
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\u Play
和PlayerButtons\u Stop
方法中。与其他控件允许您访问属性的方式相同-通过依赖属性。您可以通过滑块的value属性(如
)绑定到滑块值
要执行同样的操作,您可以在player\u控件中创建自己的dependencProperty
,然后绑定到该控件
public static DependencyProperty SliderValueProperty =
DependencyProperty.Register("SliderValue", typeof(double), typeof(player_control), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
然后将它绑定到您的视图中
<controls:player_control SliderValue={Binding MySliderValueProperty} ../>
然后将其与实际滑块控件连接,以便将该值连接到SliderValue
下载Prism并使用EventAggregator。。。
public string MySliderValueProperty
{
get { return m_SliderValue; }
set
{
if (m_SliderValue == value)
return;
// here we have an updated value
m_SliderValue = value;
RaisePropertyChanged(() => MySliderValueProperty);
}
}