多くの TextBlocks を 1 秒間に複数回更新する必要があるリアルタイム システムを実装しています。具体的には、TextBlock.Text と TextBlock.Foreground を更新する必要があります。
一般に、TextBlock.Text および TextBlock.Foreground プロパティをデータにバインドする方が (高速で効率的) 優れていますか、それとも UI スレッドにディスパッチしてこれらのプロパティを手動で設定する方が効率的ですか?
多くの TextBlocks を 1 秒間に複数回更新する必要があるリアルタイム システムを実装しています。具体的には、TextBlock.Text と TextBlock.Foreground を更新する必要があります。
一般に、TextBlock.Text および TextBlock.Foreground プロパティをデータにバインドする方が (高速で効率的) 優れていますか、それとも UI スレッドにディスパッチしてこれらのプロパティを手動で設定する方が効率的ですか?
TextBlock の前景色を変更する必要がある場合は、コンバーターの使用を検討してください。テキストに基づいて色を変更した場合のコンバーター クラスは次のようになります。
public class ForegroundColorConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string sValue = (string)value;
SolidColorBrush pBrush = new SolidColorBrush(Colors.White);
if (sValue.ToLower() == "red") pBrush = new SolidColorBrush(Colors.Red);
return pBrush;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
ユーザーコントロールまたはページにリソースを追加する必要があります。
<Page.Resources>
<local:ForegroundColorConverter x:Name="ColorConverter"/>
</Page.Resources>
texblock は次のようになります。
<TextBlock x:Name="lblText" Text="{Binding Text}" Foreground="{Binding TextColorName, Converter={StaticResource ColorConverter}}"/>
バインドするクラスをほとんど忘れていました。
public class TextBlockInfo : INotifyPropertyChanged
{
//member variables
private string m_sText = "";
private string m_sTextColorName = "";
//construction
public TextBlockInfo() { }
public TextBlockInfo(string sText, string sTextColorName)
{
m_sText = sText;
m_sTextColorName = sTextColorName;
}
//events
public event PropertyChangedEventHandler PropertyChanged;
//properties
public string Text { get { return m_sText; } set { m_sText = value; this.NotifyPropertyChanged("Text"); } }
public string TextColorName { get { return m_sTextColorName; } set { m_sTextColorName = value; this.NotifyPropertyChanged("TextColorName"); } }
//methods
private void NotifyPropertyChanged(string sName)
{
if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(sName));
}
}