3

최근에 C#을 사용하여 Windows Phone 8.1 개발을 배우기 시작했습니다. 지난 주까지 C# 또는 XAML에 대한 사전 경험이 없습니다. 아래 (XAML)와 같이 C#을 사용하여 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> 

초기 이미지는 '재생'아이콘과 놀이를 말한다 텍스트입니다 버튼에 이미지를 변경하기 위해 노력하고있어. 이것은 올바르게 작동하고 렌더링됩니다. 하지만 버튼을 '일시 중지'아이콘과 일시 중지라고 표시된 텍스트로 클릭하면 해당 이미지를 변경하고 싶습니다.

여기에 지금까지

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를 객체 내 C# 코드입니다. 현재는 텍스트가 변경하지만 버튼의 이미지가 사라하지 않는 버튼을 클릭하면

내가 지금까지 시도했다

:

내가 여기 BitmapImage과 다른 질문을 사용하기위한 MSDN 문서를 확인하고 은 일반적으로 말하는이

// 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 phone 설명서 (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 = 새 BitmapImage (새 Uri (@ "자산/미디어 중지 .png", UriKind.RelativeOrAbsolute)); – loop

+0

@ 루프가 그것을 시도했습니다. 그것은 인수 예외도 던졌다. 주어진 System.Uri는 Windows.Foundation.Uri로 변환 될 수 없다. –

답변

2

Windows Phone 런타임 응용 프로그램에서 이상하게 작동하는 것은 우리가 너무 많이 탐색하지 않았기 때문일 수 있습니다. 그러나 그것을 할 것입니다.

나는 바인딩을 사용하여 작업을 시도해 보았습니다. 또한 업데이트 할 때 몇 가지 문제점을 보여 주므로 제안하는 것은 좋은 해결책이 아니라 작동하는 것입니다. 나는 그 일을 할 때 나중에 좋은 해결책을 갱신 할 것이다.

솔루션 : -

업데이트합니다 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; 
     } 
    } 

내가 그것으로이 정보를 제거하지 않은 유용합니다.

Here I used the Windows phone 8.1 Silverlight app template

당신은 ImageFailed 이벤트 핸들러 ExceptionRoutedEventArgs e 매개 변수를 확인하실 수 있습니다은 당신은 Silverlightcross-scheme security와 관련된 문제입니다 "AG_E_NETWORK_ERROR"가 표시됩니다. 당신은 구글 AG_E_NETWORK_ERROR 수 있습니다 그럼 당신은 그것에 관련된 물건을 많이 얻을 것이다.

솔루션 코드 : -를

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; 
    } 

Change images

은 당신을 도울 것입니다 바랍니다.

+0

'네임 스페이스에'Application.GetResourceStream()'이 존재하지 않습니다. 전체 정의는 무엇입니까? 'Windows.UI.XAML.Application'? NB : 실버 라이트를 사용하고 있지 않습니다. –

+0

당신은 VS 2013을 사용하는 Windows Phone 8.1 응용 프로그램을 만들고 있습니다. – loop

+0

예 저는 VS 2013을 사용하여 Windows Phone 8.1 용으로 개발 중입니다. –