あなたのViewModel \コードビハインドで「TimerFontSize」プロパティを持っており、それにテキストボックスののFontSizeを結合しないのはなぜ。あなたのタイマーティックのよう
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
@Borris xamlのコードビハインドのプロパティを使用するサンプルコードを使用して回答を更新しました。 –