如何从“设置”弹出窗口更新页面控件

时间:2013-01-01 19:25:06

标签: c# windows-8 microsoft-metro

我正在构建一个地铁风格的应用程序。我设计了一个“设置”弹出窗口,用户可以在其中更改应用程序的HomePageView页面中包含的文本块的字体。

通过列出所有系统字体的组合框选择字体。选择字体后(在设置弹出框的组合框中)必须更新HomePageView页面中的所有文本块。

这是要更新的样式(位于standardstyles.xaml中):

 <Style x:Key="timeStyle" TargetType="TextBlock">
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontSize" Value="333.333"/>
        <Setter Property="FontFamily" Value="Segoe UI"/>
    </Style>

这是我用来更新文本块样式的代码,以及我访问SetTextBlockFont属性以更新文本块外观的代码:

private void fontBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var res = new ResourceDictionary()
            {
                Source = new Uri("ms-appx:///Common/StandardStyles.xaml", UriKind.Absolute)

            };
            var style = res["timeStyle"] as Style;

            style.Setters.RemoveAt(2);
            style.Setters.Add(new Setter(FontFamilyProperty, new FontFamily("Arial")));

            HomePageView homePageViewReference = new HomePageView();
            homePageViewReference.SetTextBlockFont = style;
        }

这是HomePageView.xaml.cs中用于更新文本块(timeHour)的SetTextBlockFont属性:

public Style SetTextBlockFont
        {
            set
            {
                timeHour.Style = value;
            }
        }

应用程序编译没有错误但是当我点击组合框中的字体时没有任何反应。我想因为我必须加载HomePageView页面homePageViewReference的新实例,或者因为我必须重新加载页面或类似的东西。

我指出我不能使用Frame对象或NavigationService类,因为这是一个metro应用程序。

1 个答案:

答案 0 :(得分:1)

您需要在视图中实现INotifyPropertyChanged,或者您可以直接使用LayoutAwarePage提供的DefaultViewModel。

Class A:INotifyPropertyChanged
{

    #region EventHandler
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
    public Style SetTextBlockFont
    {
        set
        {
            timeHour.Style = value;
            RaisePropertyChanged("SetTextBlockFont");
        }
    }
}