所以我试图为我正在制作的应用程序制作一个自定义控件,它具有一个文本块和一个可以通过绑定在代码中更改的图像。到目前为止,它主要是有效的,一旦我遇到一个小故障:当我去调试应用程序时,最初图像不会显示在控件上,但是当我进入控件的模板并更改时删除"模板"从" TemplateBinding",等待几秒钟,然后将其放回,图像突然弹出控件。这是我的代码。
模板:
<Style TargetType="local:SoundButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SoundButton">
<Grid Background="#303030" Padding="10,10,10,10">
<TextBlock FontSize="12" Text="{TemplateBinding Text}"/>
<Image x:Name="PlayingImg" Width="20" Height="20" Margin="60,60,0,0" Source="{TemplateBinding ImageSource}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
控制类:
public sealed class SoundButton : Button
{
public string Path
{
get { return (string)GetValue(PathProperty); }
set { SetValue(PathProperty, value); }
}
public static DependencyProperty PathProperty =
DependencyProperty.Register("Path", typeof(string), typeof(SoundButton), new PropertyMetadata(null));
public string FileName
{
get { return (string)GetValue(FileNameProperty); }
set { SetValue(FileNameProperty, value); }
}
public static DependencyProperty FileNameProperty =
DependencyProperty.Register("FileName", typeof(string), typeof(SoundButton), new PropertyMetadata(null));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(SoundButton), new PropertyMetadata(null));
public string ImageSource
{
get { return (string)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}
public static DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ImageSource", typeof(string), typeof(SoundButton), new PropertyMetadata(null));
private MediaElement Media = null;
public SoundButton()
{
this.DefaultStyleKey = typeof(SoundButton);
}
public async void LoadSound()
{
Media = new MediaElement();
StorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
var file = await folder.GetFileAsync(FileName);
Media.SetSource(await file.OpenAsync(FileAccessMode.Read), file.ContentType);
Media.MediaEnded += Stopped;
}
private void Stopped(object sender, RoutedEventArgs e)
{
Stop();
}
private void Stop()
{
Media.Stop();
ImageSource = "Assets\\Images\\Play.png";
}
protected override void OnTapped(TappedRoutedEventArgs e)
{
if (Media == null)
{
LoadSound();
}
base.OnTapped(e);
if (Media.CurrentState == MediaElementState.Playing)
Stop();
else
{
Media.Play();
ImageSource = "Assets\\Images\\Stop.png";
}
}
}
奇怪的是,除非我这样做,否则它实际上不会显示图像(在TextBlock值上演示,之前有相同的问题):
https://www.dropbox.com/s/bg6npa6ucqoii2w/ControlXamlUpdate.mp4?dl=0
我正在调试。我真的不明白为什么会这样。在自定义控件的方式中,我可以找到很少的文档。为什么运行时不会立即显示图像?为什么更改这样的模板会让它突然发挥作用?
答案 0 :(得分:0)
因此,为了澄清Ed所做的评论,我的第一个问题是typeof
注册中的DependencyProperty
与实际属性的类型(解决了{{1绑定问题)。我的第二个不理解TextBlock
的{{1}}值是Source
,而不是字符串,因此我的字符串赋值在代码中毫无意义。为按钮中我想要的两个图像创建了两个静态Image
值,并更改了分配以使用它们,现在也可以完美地工作。谢谢Ed!