使用c#在XAML中更改按钮的图像
本文关键字:按钮 图像 XAML 使用 | 更新日期: 2023-09-27 18:11:26
我最近开始学习使用c#开发windows phone 8.1。直到上周我才有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>
初始图像是一个"play"图标和一个表示play的文本。这工作和渲染正确。但我想改变图像,当按钮被点击到一个"暂停"图标和文本说暂停。
这是我到目前为止的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");
但是我的visual studio甚至不承认BitmapImage.BeginInit()
是一个有效的函数。
我也检查了这个问题:BitmapImage缺少BeginInit()和EndInit()函数?答案说Class在windows phone上的实现方式不一样。查看windowsphone文档(http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.media.imaging.bitmapimage%28v=vs.105%29.aspx)的类没有显示任何明确的方法来实现我想要的。
注意:我正在开发windows phone 8.1。请任何帮助将不胜感激。由于
Windows phone运行时应用程序的行为很奇怪,可能是因为我们还没有对此进行过多的研究。但我一定会的。
我也尝试过使用绑定的东西,这也显示了更新中的一些问题,所以我提出的不是一个好的解决方案,而是一个工作的。当我完成这项工作后,我会在这里更新一个好的解决方案。
<<p> 解决方案/strong>: -更新你的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 EventHandler ExceptionRoutedEventArgs e
参数,然后您将看到" age_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;
}
希望对你有帮助。