2

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

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 文件,包括一个用于主题/generic.xaml 的文件。需要做什么才能正确初始化这些依赖属性的默认值?

4

1 回答 1

1

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

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

于 2013-08-18T06:41:30.313 回答