2014-07-04 40 views
3

我最近开始学习使用C#的windows phone 8.1开发。直到上周,我还没有C#或XAML的经验。使用C#在XAML中更改按钮的图像

我试图改变一个按钮图像如下(XAML)看到

<Button x:Name="playButton" 
        VerticalAlignment="Stretch" 
        Click="Button_Click"> 
       <StackPanel Orientation="Horizontal"> 
        <Image x:Name="controlImg" Source="/Assets/Media-Play.png" /> 
        <TextBlock Text=" Play" /> 
       </StackPanel> 
      </Button> 

初始图像是一个“播放”图标,它说玩文字。这可以正常工作和渲染。但是,当按钮被点击到“暂停”图标和说暂停的文本时,我想要更改该图像。

这里是我的C#代码到目前为止

private mediaState medState = mediaState.Stopped; 

    public BitmapImage iconStop = new BitmapImage(new Uri("ms-appx:///Assets/Media-Stop.png", UriKind.RelativeOrAbsolute)); 
    public BitmapImage iconPause = new BitmapImage(new Uri("ms-appx:///Assets/Media-Pause.png", UriKind.RelativeOrAbsolute)); 
    public BitmapImage iconPlay = new BitmapImage(new Uri("ms-appx:///Assets/Media-Play.png", UriKind.RelativeOrAbsolute)); 


    private void Button_Click(object sender, RoutedEventArgs e) 
    { 


     switch (medState) 
     { 
      case mediaState.Playing: 
       medState = mediaState.Paused; 
       mediaE.Pause(); 
       playButton.Content = " Play"; 
       controlImg.Source = this.iconPlay; 
       break; 

      case mediaState.Paused: 
       medState = mediaState.Playing; 
       mediaE.Play(); 
       playButton.Content = " Pause"; 
       controlImg.Source = this.iconPause; 
       break; 

      case mediaState.Stopped:      
       medState = mediaState.Playing; 
       mediaE.Play(); 
       playButton.Content = " Pause"; 
       controlImg.Source = this.iconPause; 
       break; 
      default: 
       break; 
     } 


    } 

    public enum mediaState 
    { 
     Playing, 
     Paused, 
     Stopped 
    } 

mediaE是MediaElement的对象。 目前,当您单击按钮上的文字变化,但在按钮图像不消失

我已经试过到目前为止:

我检查了MSDN文章使用BitmapImage和其他一些问题,在这里和平时说这句话

// Create source 
BitmapImage myBitmapImage = new BitmapImage(); 

// BitmapImage.UriSource must be in a BeginInit/EndInit block 
myBitmapImage.BeginInit(); 
myBitmapImage.UriSource = new Uri(@"C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"); 

但我的视觉工作室甚至不承认BitmapImage.BeginInit()为有效的功能。

我还检查了这个问题:BitmapImage missing BeginInit() and EndInit() function?答案表示类没有以相同的方式实现Windows Phone。检查该课程的Windows手机文档(http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.media.imaging.bitmapimage%28v=vs.105%29.aspx)没有显示任何明确的方式来实现我想要的。

注:我正在开发的Windows Phone 8.1。请任何帮助,将不胜感激。谢谢

+0

@taLhaKhan我想它引发了一个异常。 –

+0

试试这个BitmapImage bm = new BitmapImage(new Uri(@“Assets/Media-Stop.png”,UriKind.RelativeOrAbsolute)); – loop

+0

@loop试过了。它也抛出了一个参数异常:给定的System.Uri不能转换成Windows.Foundation.Uri。 –

回答

2

事情只是在Windows手机运行时应用程序中表现怪异,可能是因为我们没有太多探索它。但会做到这一点。

我尝试过使用绑定的东西,也在更新中显示一些问题,所以我提议的不是一个好的解决方案,而是一个工作的。当我做这些工作时,我会在这里更新一个很好的解决方案。

解决方案: -

更新您的XAML,因为它是不应该使用的ContentTemplate用于改变显示任何控制的正确途径。并检查控件和内容模板之间的区别。

的XAML: -

<Button x:Name="PlayButton" Grid.Row="1" 
       Click="PlayButton_OnClick" > 
     <Button.ContentTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image x:Name="ControlImg" 
        Stretch="Fill" Width="100" 
        /> 
        <TextBlock Text=" Play" /> 
       </StackPanel> 
      </DataTemplate> 
     </Button.ContentTemplate> 
    </Button> 

通过添加一些代码更改按钮单击事件: -

private async void PlayButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     var btn = sender as Button; 
     // For TextBlock change the children collection index to 1 
     var img = (Image)(btn.ContentTemplateRoot as StackPanel).Children[0]; 

     switch (medState) 
     { 
      case mediaState.Playing: 
       medState = mediaState.Paused; 
      // mediaE.Pause(); 
       PlayButton.Content = " Play"; 
       img.Source = this.iconPlay; 
       break; 

      case mediaState.Paused: 
       medState = mediaState.Stopped; 
       // mediaE.Play(); 
       PlayButton.Content = " Pause"; 
       img.Source = this.iconPause; 
       break; 

      case mediaState.Stopped: 
       medState = mediaState.Playing; 
       // mediaE.Play(); 
       PlayButton.Content = " Stop"; 
       img.Source = this.iconStop; 
       break; 
      default: 
       break; 
     } 
    } 

Windows Phone的Silverlight的我没有删除此信息,因为它是有用的。

Here I used the Windows phone 8.1 Silverlight app template

您可以检查ImageFailed事件处理ExceptionRoutedEventArgs e参数,然后你会看到 “AG_E_NETWORK_ERROR”,即在Silverlight有关cross-scheme security问题。 你可以谷歌AG_E_NETWORK_ERROR然后你会得到很多与它有关的东西。

解决方案代码: -

Change images

public BitmapImage iconStop = new BitmapImage(); 
public BitmapImage iconPause = new BitmapImage(); 
public BitmapImage iconPlay = new BitmapImage(); 

private void PlayButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    switch (medState) 
    { 
     case mediaState.Playing: 
      medState = mediaState.Paused; 
      // mediaE.Pause(); 
      playButton.Content = " Play"; 

      var sri = Application.GetResourceStream(new Uri("Assets/download(1).jpg", UriKind.Relative)); 
      iconStop.SetSource(sri.Stream); 
      ControlImg.Source = iconStop; 
      break; 

     case mediaState.Paused: 
      medState = mediaState.Stopped; 
      // mediaE.Play(); 
      playButton.Content = " Pause"; 
      var sri1 = Application.GetResourceStream(new Uri("Assets/download(2).jpg", UriKind.Relative)); 
      iconPlay.SetSource(sri1.Stream); 
      ControlImg.Source = iconPlay; 
      break; 

     case mediaState.Stopped: 
      medState = mediaState.Playing; 
      // mediaE.Play(); 
      playButton.Content = " stopped"; 
      var sri2 = Application.GetResourceStream(new Uri("Assets/download(1).jpg", UriKind.Relative)); 
      iconStop.SetSource(sri2.Stream); 
      ControlImg.Source = iconStop; 
      break; 
     default: 
      break; 
    } 

希望它会帮助你。

+0

'Application.GetResourceStream()'不存在于我的命名空间中。什么是完整的定义? 'Windows.UI.XAML.Application'?注意:我没有使用'silverlight' –

+0

您正在使用VS 2013制作windows phone 8.1应用程序。 – loop

+0

是的,我正在开发使用VS 2013的Windows Phone 8.1 –