Динамическое изменение содержимого ярлыка - PullRequest
1 голос
/ 21 сентября 2011

Прежде всего, я прошу прощения, если это звучит глупо, но я очень новичок в WPF.Я делаю таймер, и я хочу изменить метку для отображения оставшегося времени.Я пытался изменить содержимое напрямую и привязав данные к свойству.Когда я делаю первое, программа просто падает;Что касается последнего, я не очень понимаю, как это работает, я огляделся по сторонам, и все, что я мог сделать, это взять некоторые подсказки из фрагментов кода в Интернете, но это не работает, и, поскольку я не знаю, что я 'Я делаю, я тоже не знаю, где я иду не так.

Код: я помещаю много вещей в класс MainWindow, это не очень хороший код, но он достаточно хорош для моих целей.Когда я попытался изменить содержимое напрямую, я сделал это, установив делегат, вызываемый моим классом таймера, когда вызывается это:

private void updateTimerLabel()
{
  lblTimer.Content = TimeToGo;
}

, где TimeToGo - это следующее свойство:

public String TimeToGo
{ 
   get { return task.TimeToGo.Hours + ":" + 
                task.TimeToGo.Minutes + ":" + task.TimeToGo.Seconds; }            
}

Что касается попытки привязки, я установил следующее свойство зависимости:

public static readonly DependencyProperty TimeToGoProperty = DependencyProperty.Register(
          "TimeToGo", typeof(String), typeof(MainWindow));

и сделал это в файле XAML:

<Window x:Class="ToDoTimer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ToDoTimer" Height="210" Width="348" 
        DataContext="{Binding RelativeSource={RelativeSource Self}}">    


    <Grid Width="326" Height="180">
        <Label Content="{Binding TimeToGoProperty}"  Height="63" HorizontalAlignment="Left" Margin="12,12,0,104" Name="lblTimer" VerticalAlignment="Center" FontSize="40" Width="218" FontFamily="Courier New" VerticalContentAlignment="Center" />
    </Grid>
</Window>

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Вот что у меня без всякой привязки (проверено и работает):

DispatcherTimer timer = new DispatcherTimer();
DateTime endDate = new DateTime();
TimeSpan timeToGo = new TimeSpan(0, 1, 0);

public MainWindow()
{
    InitializeComponent();

    this.timer.Tick += new EventHandler(timer_Tick);
    this.timer.Interval = new TimeSpan(0, 0, 1);

    this.endDate = DateTime.Now.Add(timeToGo);

    this.timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    this.lblTimer.Content = this.ToStringTimeSpan(this.endDate - DateTime.Now);

    if (this.endDate == DateTime.Now)
    {
        this.timer.Stop();
    }
}

string ToStringTimeSpan(TimeSpan time)
{
    return String.Format("{0:d2}:{1:d2}:{2:d2}", time.Hours, time.Minutes, time.Seconds);
}
0 голосов
/ 21 сентября 2011

Вы уверены, что используете DispatcherTimer, но не Timer?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...