2017-10-16 16 views
0

Donc j'essaye de faire un contrôle personnalisé pour une application que je crée, qui a un bloc de texte et une image qui peut être changée dans le code avec des liaisons. Jusqu'à présent, ça fonctionne surtout, une fois que je passe un petit accroc: quand je vais déboguer l'application, initialement l'image ne s'affiche pas sur le contrôle, mais quand je vais dans le modèle de contrôle et de changer retirer "Template" de " TemplateBinding ", attendez quelques secondes, puis remettez-le, l'image apparaît soudainement sur le contrôle. Voici mon code.Le contrôle n'affiche pas le contenu lié tant que xaml ne change pas dans le débogage

Modèle:

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

Classe de contrôle:

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

La chose étrange est que ce ne serait pas réellement montrer l'image à moins que je l'ai fait (démontré la valeur TextBlock, qui a été l'ayant même problème avant):

https://www.dropbox.com/s/bg6npa6ucqoii2w/ControlXamlUpdate.mp4?dl=0

Pendant le débogage. Je ne comprends vraiment pas pourquoi c'est comme ça. Il y a très peu de documentation là-bas, que j'ai pu trouver, à la manière des contrôles personnalisés. Pourquoi l'image n'apparaît-elle pas immédiatement? Et pourquoi changer le modèle comme ça le fait fonctionner soudainement?

+0

Est-ce que 'ImageSource' est une chaîne ou un int? Votre déclaration de prop de dép a les deux. Ne serait-ce pas habituellement [une instance 'ImageSource'] (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.imagesource)? –

+0

C'est une chaîne, car je remplace ce qui serait normalement la valeur de chaîne 'Source' dans la disposition Xaml d'un élément' Image', comme indiqué dans le modèle. Cela fonctionne très bien comme il est, quand je fais cela éditer et annuler pendant le débogage. Dans ma recherche pour lier une source 'Image', rien n'a mentionné' ImageSource'. – Malkierian

+0

"Cela fonctionne très bien". OK, pourquoi demandez-vous de l'aide? –

Répondre

0

Alors, juste pour préciser sur les commentaires que Ed a fait, mon premier problème n'a pas été correspondant le typeof dans l'enregistrement DependencyProperty au type de la propriété réelle (qui a résolu le problème de liaison TextBlock). Mon deuxième ne comprenait pas que la valeur Source de Image était un ImageSource, pas une chaîne, rendant ainsi mes affectations de chaînes en code sans signification. Créé deux valeurs ImageSource statiques pour les deux images que je voulais dans les boutons, et changé les affectations pour les utiliser, et cela fonctionne parfaitement maintenant, aussi. Merci Ed!