왜 뒤에-코드 당신의 ViewModel \에 'TimerFontSize'속성을 가지고 있고 그것을 텍스트 상자의 폰트 크기를 결합하지.
FontSize="{Binding TimerFontSize, Mode=OneWay}"
타이머가 틱하면 글꼴 크기를 다시 계산하고 'TimerFontSize'속성을 설정하십시오. 'TimerFontSize'에 대해 INotifyPropertyChanged를 구현 한 경우 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();
}
}
코드 숨김은 :
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));
}
}
}
chibacity은 확실히 밖으로 방법을 제공하고 있습니다.제 경우를 해결했지만 XAML에서 코드의 변수를 속성 값으로 사용하는 방법을 배우고 싶습니다. – Boris
@ 보리스 xaml의 코드 숨김에서 속성을 사용하는 예제 코드로 답변을 업데이트했습니다. –