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

C# 如何从实现页面访问自定义控件中的按钮?,c#,silverlight,custom-controls,C#,Silverlight,Custom Controls,我的generic.xaml包含以下代码: <ControlTemplate TargetType="local:customVideoControl"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="600"/> <RowDefinition Height="200"/&

我的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>
现在我想访问下一个TBTN,在我正在实现的页面中

CustomVideoControl myVControl=new CustomVideoControl();
这将创建控件的实例,但我想在单击 下一步和上一步按钮,thta出现在generic.xaml中的CustomVideoControl中。任何帮助都将不胜感激

谢谢,
Subhen

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

我感觉,您正在尝试模仿事件设置者的行为。如果我是对的,请看看这个简单的例子:

    <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>
从现在起,您可以直接从控件的控制控件中访问MovedNext上的和MovedPrevious上的

很抱歉,如果我之前的回答让人困惑,但它应该只是一个灵感,告诉我该怎么做:)

编辑:


我没有注意到这只涉及Silverlight,对此我深表歉意:)但是,如果您想尝试,它非常适合WPF。

您只需要向控件添加几个事件

 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中引用元素。
[……]

你想做什么,为什么不管它不是控件的功能,如果你不将责任移交给控件,那么创建控件似乎没有意义。我想在单击按钮时更改Uri,但Uri将在主应用程序中可访问。是否有一种方法可以声明依赖的Eventhandler或其他东西,以便在单击主页上的按钮时可以调用它。我尝试在silverlight中将此添加到我的generic.xaml中,似乎无效。ThanksIt对textblock完全有效:)发布一些代码,我会看看我能做些什么。抱歉,我将textblock更改为button,但它肯定会工作得很好。这对于手头的问题来说是完全不合适的。我不这么认为。很抱歉出现了一个“通用”xaml,但我只是从我的一个项目中粘贴了它来激发您的想法。安东尼,请注意,你在做完全相同的事情,只是在代码隐藏中。请查看我更新的答案以了解我的观点。请更新您的代码,因为现在它无效且无法编译。OnMovedNext和OnMovedPrevious应该有返回类型。我非常感谢你,伙计,我不确定我是否在CLR或其他方面做了违法的事情,但这正是我现在项目所需要的。Thanx一吨agn。如何以MVVM的方式实现这一点?我用这种方法工作,但我想用CaliburnMicro。因此,我会在我的虚拟机中使用MoveNext()方法,在我看来,我会说“这是可能的还是我完全疯了?我的意思与AnthonyWJones已经发布的答案完全相同。”。
 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 */ };