设置DefaultStyleKey会导致“ArgumentException:Value不在预期范围内”

时间:2013-08-15 19:40:59

标签: silverlight xaml windows-phone-8

我正在为我的移动应用程序配置一个基页,以便有一些额外的布尔依赖项属性来激活或停用某些通用应用程序栏菜单项。即使我正在使用有关其默认值的元数据注册这些依赖项属性,但似乎并未调用该值的setter。

public class MyPageBase : PhoneApplicationPage
{
    public MyBasePage() {
        DefaultStyleKey = typeof(MyPageBase);
    }

    public static readonly DependencyProperty ShowSettingsMenuItemProperty =
        DependencyProperty.Register(
        "ShowSettingsMenuItem",
        typeof(bool),
        typeof(MyPageBase),
        new PropertyMetadata(true, ShowSettingsMenuItemChanged));

    public static readonly DependencyProperty ShowLogoutMenuItemProperty =
        DependencyProperty.Register(
        "ShowLogoutMenuItem",
        typeof(bool),
        typeof(MyPageBase),
        new PropertyMetadata(true, ShowLogoutMenuItemChanged));
}

我假设我需要为页面创建一个默认的“主题”,将这两个属性设置为它们的值。我在里面创建了一个Themes文件夹和一个Generic.xaml文件,其构建操作设置为Page。然后我定义了一种非常简单的样式,其目标是将两个属性设置为元数据中的默认值的页面类型。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:view="clr-namespace:MyApplication.View">
    <Style TargetType="view:MyPageBase">
        <Setter Property="ShowLogoutMenuItem" Value="True" />
        <Setter Property="ShowSettingsMenuItem" Value="True" />
    </Style>
</ResourceDictionary>

但是,当命中基页构造函数中的第一行时,会引发以下异常:

  

System.ArgumentException:值不在预期范围内。

我在ILSpy中检查过编译的库,而Resources文件夹中包含一个g.resources文件夹,其中包含项目中的所有XAML文件,包括一个用于themes / generic.xaml的文件。要正确初始化这些依赖项属性的默认值,需要做些什么?

1 个答案:

答案 0 :(得分:1)

只有在显式更改属性值时才会调用setter方法。设置默认值不会触发它。如果您的属性影响UI元素(例如在您的情况下),通常您将通过覆盖用户控件的OnApplyTemplate()方法来调用执行UI更新的方法。

但是,由于您的PhoneApplicationPage,您可以调用您的UI更新方法来显示/隐藏Loaded事件中的菜单。属性的值将与您设置的默认值相同,在您的情况下,默认值设置为true。