在调试中xaml发生更改之前,控件不会显示绑定的内容

时间:2017-10-16 16:56:01

标签: c# uwp uwp-xaml

所以我试图为我正在制作的应用程序制作一个自定义控件,它具有一个文本块和一个可以通过绑定在代码中更改的图像。到目前为止,它主要是有效的,一旦我遇到一个小故障:当我去调试应用程序时,最初图像不会显示在控件上,但是当我进入控件的模板并更改时删除"模板"从" 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

我正在调试。我真的不明白为什么会这样。在自定义控件的方式中,我可以找到很少的文档。为什么运行时不会立即显示图像?为什么更改这样的模板会让它突然发挥作用?

1 个答案:

答案 0 :(得分:0)

因此,为了澄清Ed所做的评论,我的第一个问题是typeof注册中的DependencyProperty与实际属性的类型(解决了{{1绑定问题)。我的第二个不理解TextBlock的{​​{1}}值是Source,而不是字符串,因此我的字符串赋值在代码中毫无意义。为按钮中我想要的两个图像创建了两个静态Image值,并更改了分配以使用它们,现在也可以完美地工作。谢谢Ed!