2013-11-25 158 views
1

我正在開發基於Silverlight 5的MVVM模式的播放器。我試圖在後面的代碼中更改狀態按鈕。訪問元素組件Silverlight

文件:PlayerPage.xaml
我的播放器組件XAML:

<Grid x:Name="LayoutRoot"> 
    <player:Player x:Name="Player" 
        Playlist="{Binding Playlist}" 
        CurrentPlaylistItem="{Binding CurrentPlaylistItem, Mode=TwoWay}" 
        IsSeekingEnabled="{Binding CanSeek}" 
        AutoLoad="True" 
        AutoPlay="True" 
        MediaEnded="Player_MediaEnded" 
        MediaOpened="Player_MediaOpened" 
        Style="{StaticResource PlayerStyle}" 
        PlaylistVisibility="Disabled" 
        LogLevel="Warning" 
        AutoHideControls="True" 
        AutoHideDelay="0:0:5" 
        AllowDoubleClickToggle="True" 
        RetryDuration="00:01:00" 
        RetryInterval="00:00:10" 
        BufferingTime="00:00:15" 
     /> 

</Grid> 

文件:PlayerPage.xaml
成分球員的風格:

<Grid x:Name="ControllerContainer" Height="40" Grid.Row="4" RenderTransformOrigin="0.5,0.5"> 
    <Grid.RenderTransform> 
     <CompositeTransform /> 
      </Grid.RenderTransform> 
       <Grid.Background> 
        <ImageBrush ImageSource="component/Images/grid_background_player.jpg" 
            AlignmentY="Top" /> 
         </Grid.Background> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="120" /> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition /> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 
          <Grid x:Name="playercontrols" Grid.Column="0" HorizontalAlignment="Left" Width="90"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <Grid Grid.Column="0"> 
            <Button x:Name="TbPlayElement" Click="TbPlayElement_Click" HorizontalAlignment="Left" Cursor="Hand" > 
               <Grid> 
                <Image Source="component/Resources/play.png" Stretch="Uniform" Height="16" Width="16" /> 
               </Grid> 
            </Button> 
在我的代碼

現在後面PlayerPage.cs,當我按下st op按鈕,我想更改播放按鈕的圖像。

private void TbStopElement_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 

    } 

如何在後面的代碼中訪問播放按鈕?

+0

綁定圖像的源類型的BitmapImage的屬性。 –

回答

2

連接到Loaded事件保存圖像的參考:

xaml:

<Image Source="component/Resources/play.png" Stretch="Uniform" Height="16" Width="16" 
     Loaded="ImageLoaded" /> 

後臺代碼:

private Image imageReference; 
private void ImageLoaded(object sender, EventArgs e) 
{ 
    imageReference = sender as Image; 
} 

然後,當你想改變形象:

private void TbStopElement_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    if(imageReference != null) 
    { 
     imageReference.Source = new BitmapImage(new Uri("/YourAppName;component/Resources/YourImage.png", UriKind.Relative)); 
    } 
} 
+0

Yessss!其作品 !謝謝你:p – Flug

+2

如果可以的話,我會加倍努力,但我需要15個代表... – Flug

1

我建議你這個代碼

TbPlayElement.Source = new BitmapImage(new Uri("/TbPlayElement.content;component/NameNewImage.png", UriKind.Relative)); 

注:請在Visual Studio屬性的XAML文件,確保Build Action is set to Page

或者你可以使用切換按鈕

鏈接:像這樣在你的TbStopElementhttp://msdn.microsoft.com/en-us/library/cc296245%28v=vs.95%29.aspx

+0

我測試了這段代碼,但按鈕或圖像不被visual studio識別,我無法達到它的屬性,所以我沒有編譯。 – Flug

+0

這是您的圖片控件的屬性,但對於路徑,您必須添加圖片文件,確保圖片在您的存儲庫中 –

+0

我不確定我的理解。我的圖片是投注資源,我的問題是我無法得到他們的手在這個按鈕或圖像 – Flug

1

訪問:

 var grid = TbPlayElement.Content as Grid; 
     var playImage = grid.Children[0] as Image; 

     BitmapImage bitmap = new BitmapImage(); 
     bitmap.UriSource = new Uri("newImage.png", UriKind.Relative); 
     playImage.Source = bitmap; 
+0

謝謝,我試過你的代碼,並且bitmap.Beginit和bitmap.endInit不存在,並且我不訪問PlayImage x:name。這是我的問題。 – Flug

+0

對不起,忘了它是'WPF'特定的。我會相應地更新。你可以嘗試沒有這些方法? –

+1

@Flug當你說,你不能訪問PlayImage x:Name,你的意思是你沒有訪問源代碼? – sthotakura