私にとってSOの新年の早いスタート:)
簡単なことだと思っていた友達を助けようとしています。基本的には、実行時にコードでスタイルを変更し、TextBlockのスタイルを更新するだけです。
TextBlockを除いて、他のタイプの要素でこれを機能させるのに問題はありませんでした。ここで何かを見逃したのか、それとも実際にバグがあるのか、私は今非常に興味があります。これを解決するための最も良い方法は何でしょうか?
ここでのコードはデモンストレーション用であり、TextBoxでは機能しますがTextBlockでは機能しません(もちろんtargettypeなどが変更された場合)
Commonフォルダーの下のStandardStylesと呼ばれるリソース辞書で定義されたスタイル
<Style x:Key="textStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="red"/>
<Setter Property="FontFamily" Value="Segoe UI"/>
</Style>
UI
<StackPanel Orientation="Horizontal">
<ListBox ItemsSource="{Binding Fonts}" Height="300" Width="300" SelectionChanged="ListBox_SelectionChanged_1"></ListBox>
<Border BorderBrush="White" BorderThickness="5" Padding="20,0,0,0" Height="300" Width="300">
<TextBlock Text="Hi here is some text" Style="{Binding FontStyleText}"/>
</Border>
</StackPanel>
コード
public sealed partial class MainPage : INotifyPropertyChanged
{
private Style _fontStyleText;
public Style FontStyleText
{
get
{
return this._fontStyleText;
}
set
{
if (value == this._fontStyleText) return;
this._fontStyleText = value;
NotifyPropertyChanged();
}
}
private List<string> _fonts;
public List<string> Fonts
{
get
{
return this._fonts;
}
set
{
if (value == this._fonts) return;
this._fonts = value;
NotifyPropertyChanged();
}
}
public MainPage()
{
this.InitializeComponent();
DataContext = this;
Fonts = new List<string> {"Segoe UI", "Showcard Gothic", "Arial"};
FontStyleText = Application.Current.Resources["textStyle"] as Style;
}
private void ListBox_SelectionChanged_1(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e)
{
var font = (sender as ListBox).SelectedItem as string;
var res = new ResourceDictionary()
{
Source = new Uri("ms-appx:///Common/StandardStyles.xaml", UriKind.Absolute)
};
var style = res["textStyle"] as Style;
style.Setters.RemoveAt(0); // if it is the first item otherwise for more accurat removal se below :D
foreach (var item in style.Setters.Cast<Setter>().Where(item => item.Property == FontFamilyProperty))
{
style.Setters.Remove(item);
}
style.Setters.Add(new Setter(FontFamilyProperty, new FontFamily(font)));
style.Setters.Add(new Setter(ForegroundProperty, new SolidColorBrush(Colors.Purple)));
FontStyleText = style;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}