Почему бы не иметь свойство TimerFontSize в ViewModel \ Code-Behind и привязать к нему TextBox FontSize.
FontSize="{Binding TimerFontSize, Mode=OneWay}"
По мере того как ваш таймер тикает, пересчитайте размер шрифта и установите свойство TimerFontSize. Если вы внедрили INotifyPropertyChanged для TimerFontSize, привязка TextBox автоматически обновится и изменит размер шрифта.
Этот шаблон будет использовать ваш таймер плюс привязку данных для управления анимацией.
Обновление
Я понимаю, что ты имеешь в виду. отделяя визуальное представление от представления данных. Мое предложение - это простой способ. Вы можете очистить его, сделав доступным для свойства истекшее время или значение обратного отсчета, а затем используйте ValueConverter , чтобы получить FontSize. Это позволит отделить данные и просмотреть концепции.
Вот пример кода, демонстрирующий свойство в вашем коде. Просто используйте привязку, которую я ранее подробно описал, чтобы подключить ее. В идеале вы должны реорганизовать код в класс ViewModel, а не помещать его в выделенный код, просто принимая все по шагам.
public partial class TimerView : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private double _fontSize;
private readonly DispatcherTimer _timer;
public TimerView()
{
InitializeComponent();
_timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
_timer.Tick += delegate {/*calculate font size and set TimerFontSize*/};
_timer.Start();
}
public double TimerFontSize
{
get { return _fontSize; }
private set
{
_fontSize = value;
InvokePropertyChanged("TimerFontSize");
}
}
private void InvokePropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
Обновление 2
А чтобы отделить представление модели от представления представления, используйте ValueConverter, например ::
Переплет:
FontSize="{Binding PercentageComplete,
Mode=OneWay,
Converter={StaticResource percentToFontSizeConverter}}"
ValueConverter:
public class PercentToFontSizeValueConverter : IValueConverter
{
private static double _DpiX;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double percent = (double)value;
double fontPointSize = (percent * 300);
double fontDpiSize = (fontPointSize * (DpiX / 72d));
return fontDpiSize;
}
private static double DpiX
{
get
{
if (_DpiX == 0)
{
Matrix m = PresentationSource.
FromVisual(Application.Current.MainWindow).
CompositionTarget.
TransformToDevice;
_DpiX = (m.M11 * 96d);
}
return _DpiX;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Code-Behind:
public partial class TimerView : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private double _percent;
private readonly DispatcherTimer _timer;
public TimerView()
{
InitializeComponent();
_timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
_timer.Tick += delegate{/*Calulate perecent and set PercentageComplete */};
_timer.Start();
}
public double PercentageComplete
{
get { return _percent; }
private set
{
_percent = value;
InvokePropertyChanged("PercentageComplete");
}
}
private void InvokePropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}