如何从实现页面访问自定义控件内的按钮?

我的generic.xaml包含以下代码:

             

现在在applyTemplate上,我正在访问如下控件:

  public override void OnApplyTemplate() { base.OnApplyTemplate(); ToggleButton playPauseBtn = GetTemplateChild("playPauseBtn") as ToggleButton; Button prevBtn= GetTemplateChild("prevBtn") as Button; Button nextBtn = GetTemplateChild("nextBtn") as Button; MediaElement customMediaPlayer = GetTemplateChild("customMediaPlayer") as MediaElement; playPauseBtn.Checked += (obj, Args) => { customMediaPlayer.Pause(); playPauseBtn.Content = "Play"; }; playPauseBtn.Unchecked += (obj, Args) => { customMediaPlayer.Play(); playPauseBtn.Content = "Pause"; }; nextBtn.Click += (obj, Args) => { customMediaPlayer.Source=new Uri(CustomMediaSource.ToString(),UriKind.RelativeOrAbsolute); }; prevBtn.Click += (obj, Args) => { customMediaPlayer.Source = new Uri(CustomMediaSource.ToString(), UriKind.RelativeOrAbsolute); }; } 

现在我想要在我正在实现的页面中使用nextBtn

 CustomVideoControl myVControl=new CustomVideoControl(); 

这将创建控件的实例,但我希望在单击next和previous按钮时执行某些操作,thta存在于generic.xaml中的CustomVideoControl中。 任何帮助将不胜感激。

谢谢,Subhen

您只需要向Control添加几个事件。

  public event EventHandler MovedPrevious public event EventHandler MovedNext 

现在这通常是这样实现的: –

  protected virtual void OnMovedPrevious(EventArgs e) { var handler = MovedPrevious; if (handler != null) handler(this, e); } protected virtual void OnMovedNext(EventArgs e) { var handler = MovedNext; if (handler != null) handler(this, e); } 

现在,在您现有的点击事件中: –

 nextBtn.Click += (obj, Args) => { customMediaPlayer.Source=new Uri(CustomMediaSource.ToString(),UriKind.RelativeOrAbsolute); //No idea what this doing OnMovedNext(EventArgs.Empty); }; prevBtn.Click += (obj, Args) => { customMediaPlayer.Source = new Uri(CustomMediaSource.ToString(), UriKind.RelativeOrAbsolute); //No idea what this is doing either OnMovedPrevious(EventArgs.Empty); }; 

现在在你的消费代码中,你可以做这样的事情: –

 CustomVideoControl myVControl=new CustomVideoControl(); myVControl.MovedNext += (s, args) => { /* deal with next */ }; myVControl.MovedPrevious += (s, args) => { /* deal with previous */ }; 

对不起,你做错了。 没有充分理由为什么你应该引用DataTemplate IMO中的元素。 [… 在这个论坛post中阅读更多 …]

您可以在自定义控件中创建公共事件,例如NextButtonClicked和PreviousButtonClicked。

我有一种感觉,你正试图模仿EventSetter的行为。 如果我是对的,请看一下这个简单的例子:

   

此代码直接从XAML将您的自定义事件分配给某个文本块的常规操作(您不必通过访问控件的属性来污染您的代码)。

我希望这有用,但如果没有,请给我一个大喊。

编辑:

很抱歉没有完全清楚(这只是一个快速粘贴的代码段)。 请看一个完整的例子:

下一个/上一个按钮的样式:

   

代码背后:

  public event EventHandler MovedPrevious; public event EventHandler MovedNext; protected void OnMovedPrevious(object sender, RoutedEventArgs e) { if (MovedPrevious != null) { MovedPrevious(this, e); } } protected void OnMovedNext(object sender, RoutedEventArgs e) { if (MovedNext != null) { MovedNext(this, e); } } 

从现在开始,您可以直接从您的控件的处理控件/安东尼发布的内容访问OnMovedNextOnMovedPrevious

对不起,如果我以前的回答令人困惑,但它应该只是一个灵感做什么:)

编辑:

我没有注意到这只涉及我向其道歉的Silverlight :)但是,如果您想尝试,它对WPF非常有效。