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));
}

次に、これら 2 つのプロパティをそれぞれの値に設定するページのデフォルトの「テーマ」を作成する必要があると考えました。ビルド アクションを Page に設定して、Themes フォルダーと Generic.xaml ファイルを内部に作成しました。次に、メタデータで 2 つのプロパティをデフォルト値に設定するページ タイプを対象とする非常に単純なスタイルを定義しました。

<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 フォルダーには、themes/generic.xaml 用のファイルを含む、プロジェクトのすべての XAML ファイルを含む g.resources フォルダーが含まれています。これらの依存関係プロパティの既定値を正しく初期化するには、何をする必要がありますか?

4

1 に答える 1

1

setter メソッドは、プロパティの値を明示的に変更した場合にのみ呼び出されます。デフォルト値を設定してもトリガーされません。あなたの場合のように、プロパティが UI 要素に影響を与える場合、通常はOnApplyTemplate()、ユーザー コントロールのメソッドをオーバーライドして、UI の更新を行うメソッドを呼び出します。

ただし、あなたのものはPhoneApplicationPageUI update メソッドを呼び出して、イベントのメニューを表示/非表示にすることができますLoaded。プロパティの値は、設定したデフォルト値と同じになります。この場合は true に設定されています。

于 2013-08-18T06:41:30.313 に答える