【问题标题】:Setting DefaultStyleKey results in "ArgumentException: Value does not fall within the expected range"设置 DefaultStyleKey 会导致“ArgumentException:值不在预期范围内”
【发布时间】:2013-08-15 19:40:58
【问题描述】:

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

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 的文件。需要做什么才能正确初始化这些依赖属性的默认值?

【问题讨论】:

    标签: silverlight xaml windows-phone-8


    【解决方案1】:

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

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

    【讨论】:

    • 似乎是对的。与其说设置器没有被调用,而是我的“更改”函数没有完成任何事情,因为该值没有被视为从默认值发生变化。我决定测试布尔值并在加载时运行一次初始化以获取真实值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2016-05-23
    • 2012-06-24
    • 2011-08-09
    相关资源
    最近更新 更多