2010-04-22 76 views
2

我有一个包含下面的代码我generic.xaml:如何从实现页面访问自定义控件中存在的按钮?

<ControlTemplate TargetType="local:customVideoControl"> 

    <Grid> 

      <Grid.RowDefinitions> 
        <RowDefinition Height="600"/> 
        <RowDefinition Height="200"/> 
      </Grid.RowDefinitions> 

      <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="200"/> 
         <ColumnDefinition Width="200"/> 
         <ColumnDefinition Width="200"/> 
      </Grid.ColumnDefinitions> 

        <MediaElement x:Name="customMediaPlayer" Source="{TemplateBinding CustomMediaSource}" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center" 
            Height="{TemplateBinding Height}" 
            Width="{TemplateBinding Width}" 
            Grid.Row="0" Grid.ColumnSpan="3" 
            /> 

        <ToggleButton x:Name="playPauseBtn" Height="50" Width="50" Content="Pause" Grid.Row="1" Grid.Column="0"/> 
        <Button x:Name="prevBtn" Height="50" Width="50" Content="Prev" Grid.Row="1" Grid.Column="1"/> 
        <Button x:Name="nextBtn" Height="50" Width="50" Content="Next" Grid.Row="1" Grid.Column="2"/> 

    </Grid> 
</ControlTemplate> 

现在就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); 
      }; 

     } 

现在我想acccess的nextBtn,在页面里我喜欢落实

CustomVideoControl myVControl=new CustomVideoControl(); 

这将创建控件的实例,但我想要做的事就点击next和previous按钮,thta存在于generic.xaml中的CustomVideoControl内。任何帮助将不胜感激。

感谢, Subhen

+0

它是什么,你想要做什么,为什么是什么不是控制功能,似乎没有一点创建控制,如果你不'将责任移交给控制。 – AnthonyWJones 2010-04-22 11:33:34

+0

我想改变Uri,当我点​​击按钮时,但uri将在主应用程序中可访问。 有没有一种方法可以声明一个依赖的Eventhandler或其他东西,以便可以在单击主页面上的该按钮时调用它。 – Simsons 2010-04-22 11:45:05

回答

1

你只需要添加一些事件到你的控制。

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 */ }; 
+0

请更新您的代码,因为现在它是无效的,不会编译。 OnMovedNext和OnMovedPrevious应该有返回类型。 – 2010-04-22 14:47:50

+0

@Piotr:看上去很好 – AnthonyWJones 2010-04-22 15:28:15

+0

我对你的感激之情guyz,我不确定m是否在CLR或其他方面做了非法的事情,但这正是我现在需要的。感谢你的帮助! – Simsons 2010-04-23 04:22:45

0

您可以创建自定义控制公共事件,像NextButtonClicked和PreviousButtonClicked。

+0

您能否解释一下 – Simsons 2010-04-22 11:59:38

+0

我的意思与AnthonyWJones已经发布的答案完全一样。 – 2010-04-23 07:20:35

0

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

<Style TargetType="{x:Type Button}" x:Key="SomeID"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Cursor" Value="Hand"></Setter> 
       <Setter Property="FontWeight" Value="Bold"></Setter> 
      </Trigger> 
     </Style.Triggers> 
     <EventSetter Event="MouseUp" Handler="DoSomething_Click"></EventSetter> 
    </Style> 

此代码自定义事件直接从XAML分配给一些文本块的常规动作(你不必与落后污染你的代码访问控件的属性)。

我希望这有帮助,但如果没有,请给我留言。

编辑:

对不起,我不是十分清楚(这只是一个快速粘贴代码片段)。请有一个完整的例子来看看:

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

<Style TargetType="{x:Type Button}" x:Key="PreviousButtonstyle"> 
    <EventSetter Event="Click" Handler="OnMovedPrevious"></EventSetter> 
</Style> 

<Style TargetType="{x:Type Button}" x:Key="NextButtonstyle"> 
    <EventSetter Event="Click" Handler="OnMovedNext"></EventSetter> 
</Style> 

后面的代码:

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。

+0

我试图将这个添加到我在silverlight中的generic.xaml,似乎无效 谢谢 – Simsons 2010-04-22 13:09:57

+0

它完全有效的textblock :)发布一些代码,我会看看我能做些什么。 – 2010-04-22 13:17:11

+0

对不起,我将TextBlock更改为Button,但它应该可以正常工作。 – 2010-04-22 13:27:18

相关问题