2010-04-22 71 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

相關問題