Связывание данных и таймер в WPF? - PullRequest
0 голосов
/ 10 февраля 2010

Я напишу код с привязкой данных и таймером для последовательного изменения изображения.
например: каждые две секунды.

ниже мой код C #:

public class GenerateRandomImagePath
{
    Random random = new Random((int)DateTime.Now.Ticks);
    readonly int MinInt;
    readonly int MaxInt;
    readonly string PrefixImagesName;
    readonly string ImageExtension;

    /// <summary>
    /// Used in data binding
    /// </summary>
    public string ImageFullPath { get; set; }

    public GenerateRandomImagePath(string prefixName, string extension)
    {
        this.PrefixImagesName = prefixName;
        this.MinInt = 1;
        this.MaxInt = 100;
        this.ImageExtension = extension;
    }

    int RandomNumber()
    {
        return random.Next(this.MinInt, this.MaxInt);
    }

    public void GenerateNewRandomImagePath()
    {
        this.ImageFullPath = this.PrefixImagesName + RandomNumber() + this.ImageExtension;
    }
}

public partial class MainWindow : Window
{
    GenerateRandomImagePath RandomImagePath;
    System.Timers.Timer timer = new System.Timers.Timer(2000);

    public MainWindow()
    {
        InitializeComponent();
        RandomImagePath = new GenerateRandomImagePath(@"C:\Users\MDS\Pictures\Nature 02\Nature ", @".jpg");
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;

        this.DataContext = RandomImagePath;
        RandomImagePath.GenerateNewRandomImagePath();//this line works well
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        RandomImagePath.GenerateNewRandomImagePath();
    }
}

Код XAML:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="sth.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="800" Height="600" mc:Ignorable="d">

    <Grid x:Name="LayoutRoot">
        <Image Source="{Binding Path=ImageFullPath}" />
    </Grid>
</Window>

Код работает только в первый раз! После этого таймер изменится ImageSource , но это не повлияет на просмотр!
Не могли бы вы вести меня?

Спасибо

1 Ответ

2 голосов
/ 10 февраля 2010

Согласно вашему коду, класс GenerateRandomImagePath не реализует INotifyPropertyChanged. WPF не может знать, что ImageFullPath изменился, если вы не сообщите об этом, либо реализовав этот интерфейс, либо изменив класс на производный от DependencyObject и превратив свойство в свойство зависимости.

Я бы предложил реализовать INotifyPropertyChanged - это более легкий подход.

public class GenerateRandomImagePath : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
    }

    private string _imageFullPath;
    public string ImageFullPath
    {
        get { return _imageFullPath; }
        set
        {
            _imageFullPath = value;
            OnPropertyChanged("ImageFullPath");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...