【问题标题】:transfer message between different user controls in WPF/C#在 WPF/C# 中的不同用户控件之间传输消息
【发布时间】:2014-02-18 14:02:24
【问题描述】:

我使用 WPF/C# 创建了一个视频播放器窗口,其中包含一些部件、一个监视器、一个滑块和一些播放器按钮,如下图所示:

由于如果所有用户控件对象都写在一个 .xaml 中,那么该文件将很大并且难以编辑。因此,我将控件对象拆分为几个不同的 .xaml 文件,例如,我定义了一个包含所有播放器按钮的 public partial class player_control : UserControl。但现在我不知道如何将消息从这个 UserControl 传递给其他控件,例如滑块player_slider。正常情况下,如果我们点击下一帧的按钮,会触发player_slider.ValueChange函数,但是我不知道如何实现这样的函数。

我是 WPF/C# 的新手,请帮我解答问题。

【问题讨论】:

标签: c# wpf xaml


【解决方案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_PlayPlayerButtons_Stop 方法中。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      根据您拥有的应用程序类型,我猜您需要跨不同用户控件处理事件,而不是共享属性。因为根据您在屏幕截图中的内容,您将需要处理播放/暂停、停止、下一步、返回等...事件。

      对于这种情况,我最好的选择是中介模式,您可以搜索以更好地理解。简而言之,将有一个中介坐在中间,您的两个控件将使用中介来相互通信。

      中介者模式参考。 http://code.msdn.microsoft.com/windowsdesktop/The-Mediator-Pattern-c2c07b54

      【讨论】:

        【解决方案4】:

        与其他控件让您访问属性的方式相同 - 通过依赖属性。您可以通过其 Value 属性绑定到 Sliders 值,例如 &lt;Slider Value={Binding MySliderValueProperty} .. /&gt;

        同样,您可以在您的player_control 中创建您自己的DependencyProperty,然后您可以绑定到该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} ../>
        

        “值已更改”将在绑定属性的设置器中,就像普通的 Slider 一样

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多