XAML でリキッド レイアウト

リキッド レイアウト (liquid layout) とは、表示領域のサイズによって動的に表示方法が最適化されるようなレイアウトを指します。

もしレイアウトについてとくに意識せずに固定サイズのアプリケーションを実装してしまうと、
ウィンドウのサイズが小さい場合には一部のコンテンツが隠れたり、
逆にウィンドウのサイズが大きい場合には空白ができたりしてしまいます。

ディスプレイの解像度の制限やユーザーによるウィンドウのサイズ変更など、
表示領域のサイズの連続的な変化に対応しなければなりません。

以下では、XAML 系アプリケーションでリキッド レイアウトを実現するためのパターンと実装例を紹介します。

(1) Grid

Grid では、ColumnDefinitions プロパティおよび RowDefinitions プロパティにより、各行・列の幅を指定できます。
固定値のほか、他の行・列との相対値 (1:2 にする場合など) や内部のコンテンツの幅 (Auto) も指定できます。

(2) ScrollViewer

ScrollViewer を利用すれば、スクロールにより全体を表示させることができます。
コレクション データを扱う場合は、ScrollViewer と WrapPanel を組み合わせて使うとよいでしょう。
ちなみに ScrollViewer は、既定で縦スクロールバーが有効、横スクロールバーが無効に設定されています。

(3) Viewbox

Viewbox は、表示領域に合わせて内部のコンテンツを伸縮させることにより、元のレイアウトを保持します。
最も手っ取り早い方法かもしれません。

(4) 最大値・最小値の指定

Viewbox のような伸縮させるコントロールでは、既定では無制限にコンテンツが拡大・縮小してしまいます。
したがって、サイズの最大値・最小値を指定する方法も有効です。

 

これらのパターンを実装する例として、次の WPF アプリケーションを作成しました。

(全体のソースコードは GitHub の LayoutWpf にあります。)

 

ここでは 4 つの表示領域があり、
左上はとくに何も対策しない例、右上は ScrollViewer を使う例、
左下は Viewbox を使う例、右下は Viewbox の横幅に最大値を指定する例です。

各領域では、内部のコンテンツとしてコレクション データを ItemsControl で表示させています。
この ItemsControl の ItemsPanel を WrapPanel に設定しています。

また、この 4 つの表示領域は 2×2 の Grid 上にあり、行も列も 1:1 に分割されています。

このアプリケーションを起動するとこうなります。

起動時の状態

 

ウィンドウのサイズを小さくします。
左上および右上では WrapPanel の列の数が減りますが、
左上では、下部を表示することができません。右上では、スクロールすれば残りが表示されます。
左下と右下では Viewbox に合わせてコンテンツが縮小されます。

小さくした状態

 

今度は、ウィンドウのサイズを大きくします。
左上および右上では WrapPanel の列の数が増えています。
左下では Viewbox に合わせてコンテンツが拡大されるのに対し、右下では Viewbox が一定以上は大きくなりません。

大きくした状態

 

作成したサンプル
LayoutWpf (GitHub)

参照
Grid クラス
ScrollViewer クラス
Viewbox クラス

プロパティ変更とエラー情報の通知 (概念編)

先にプロパティ変更とエラー情報の通知 (実装編) を投稿しましたが、
今回は通知のプログラミング手法について概念的に考えてみます。

まず、従来のいわゆる手続き的なプログラミング手法の場合で、次のようなコードがあったとします。

try
{
    // ある処理を実行する

    // ある処理の実行が完了した場合の処理
}
catch (Exception) // エラーが発生する
{
    // エラーが発生した場合の処理
}

この手続きの中に現れる処理を、観測者と被観測者の 2 つのオブジェクトに役割を分担させるように変更します。
そのためには、被観測者側のコードを次のようにします。

try
{
    // ある処理を実行する

    // ある処理の実行が完了したことを観測者に通知する (通知後の処理は観測者が知っている)
}
catch (Exception) // エラーが発生する
{
    // エラーが発生したことを観測者に通知する (通知後の処理は観測者が知っている)
}

ある処理を被観測者側で実行し、それが完了したら観測者に通知します。
観測者はその通知をトリガーとして何らかの処理を実行します。

これが Observer パターンで、この Wikipedia に載っている図と同様にクラス図を作ると次のようになります。

Observer パターン

 

通知後の処理を関数として渡せるようにするには、プログラミング インターフェイスを次のように変形します。

Observer パターン

 

.NET の場合、イベントを利用することができます。

Observer パターン

 

.NET ではとくに、データのエンティティなどに適用できるインターフェイスとして
INotifyPropertyChanged, INotifyDataErrorInfo が用意されており、
XAML 系テクノロジのデータ バインディングでは、これらを利用してプレゼンテーション層とモデル層における関心事を分離します。
つまり、アプリの本質的なロジックをモデル層に集中させ、プレゼンテーション層は同期的に追従して UI を更新する、
といったプログラミング スタイルを実現できます。

なお、プログラミング インターフェイスの変更については、
Reactive Extensionsの概要と利用方法にも同様の議論が記載されています。

参照
プロパティ変更とエラー情報の通知 (実装編)
Observer パターン
Reactive Extensionsの概要と利用方法

プロパティ変更とエラー情報の通知 (実装編)

XAML 系テクノロジにおけるデータ バインディングは、
プレゼンテーション層とモデル層の間のデータ同期を自動化するプログラミング モデルを実現するための仕組みです。
バインディング ソース (主にモデル層のデータ) では、オブジェクト内で変化が起こった場合にそのことを通知します。

これは Observer パターンの活用例の 1 つです。
Observer パターンについては、プロパティ変更とエラー情報の通知 (概念編) に書きました。

以下では、主に MSDN ライブラリの資料をもとに、バインディング ソースを実装する際の注意点をまとめました。
大きく、プロパティ変更通知とエラー情報通知に分けられます。

 

■ プロパティ変更通知

オブジェクトのプロパティの値が変更される・されたことを通知するには、
INotifyPropertyChanging インターフェイス (プロパティ変更前) および
INotifyPropertyChanged インターフェイス (プロパティ変更後) を実装します。
INotifyPropertyChanging インターフェイスの実装は省略されることもあります。

これらのインターフェイスでは PropertyChanging イベントおよび PropertyChanged イベントを実装することになりますが、
イベント引数の PropertyName には、変更されたプロパティの名前を指定します。
ここで null または空文字列を指定すれば、オブジェクトのすべてのプロパティが変更されたという意味になります。
ただし、実際には null はあまり使わず、空文字列を使うことが多いようです。

以前は、プロパティ内でこれを実装するためにプロパティ名の文字列をコードに埋め込んでいましたが、
.NET Framework 4.5 または Windows ストアでは CallerMemberName 属性を利用することで回避できます。

public class Person : INotifyPropertyChanged
{
    private string name;

    public string Name
    {
        get { return name; }
        set
        {
            if (name == value) return;
            name = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };

    public void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

 

⋄ コレクション変更通知

コレクションが変更されたことを通知するには、INotifyCollectionChanged インターフェイスを実装します。
自分で実装しなくても、ObservableCollection<T> クラスを利用すればほぼ十分です。

 

■ エラー情報通知

オブジェクトの中でエラーが発生したことを通知するには、INotifyDataErrorInfo インターフェイスを実装します。
主に、ユーザーからの入力値を検証する場合などに利用されます。
INotifyDataErrorInfo インターフェイスは Silverlight で先に登場しており、解説もこちらのほうが詳しく記載されています。

なお、以前から IDataErrorInfo インターフェイスがありましたが、
これは古い形式で、通知イベントが発生する形式にはなっていません。今後は使われなくなるでしょう。

さて、以下は INotifyDataErrorInfo インターフェイスの実装方法です。

内部でエラーが発生したら、例えば変数などにエラー情報をキャッシュしておき、ErrorsChanged イベントを発生させます。
プロパティ変更通知のときと同様、ErrorsChanged イベントの引数にはプロパティ名を渡します。
ここで null または空文字列を指定すれば、オブジェクトのレベルでエラーが発生したという意味になります。

そして GetErrors メソッドで、実際のエラーのコレクションを取得できるようにします。

HasErrors プロパティでは、エンティティ レベルにもプロパティ レベルにもエラーが存在しない場合に false を返します。
ただし、標準のバインディング エンジンに利用されることはないようです。
通常は、プロパティ名を指定できる ErrorsChanged イベントと GetErrors メソッドを使います。

INotifyDataErrorInfo.ErrorsChanged イベントの説明には、ErrorsChanged イベントを UI スレッドで発生させる、
と書かれていますが、Binding オブジェクトでデータ バインディングを設定してある場合には
UI スレッドでデータ ソースの値が取得されるため、UI スレッドでなくてもとくに問題はなさそうです。

以下は、その他の注意点です。

・GetErrors メソッドで INotifyCollectionChanged が実装されたコレクションを返す場合であっても、
    ErrorsChanged イベントを発生させる。
・GetErrors の戻り値の各アイテムに対して ToString メソッドを呼び出したらエラー メッセージを取得できる。
    例えば、ValidationResult オブジェクトを利用する。

 

INotifyDataErrorInfo インターフェイスの実装方法については以上ですが、
標準のバインディング エンジンの中核である Binding オブジェクトの設定の注意についても記述しておきます。

・ValidatesOnNotifyDataErrors プロパティ : INotifyDataErrorInfo のエラー検知をする場合。
・ValidatesOnDataErrors プロパティ : IDataErrorInfo のエラー検知をする場合。通常は使いません。
・ValidatesOnExceptions プロパティ : 例外を検知する場合。
・NotifyOnValidationError プロパティ : エラーを検知したときに、WPF の場合は UI 要素の Validation.Error 添付イベントを、
    Silverlight の場合は UI 要素の BindingValidationError イベントを発生させる。

これらのプロパティの既定値は、ValidatesOnNotifyDataErrors のみ true で、その他はすべて false です。
Silverlight の ValidationSummary などの一部のコントロールを利用する場合、
NotifyOnValidationError プロパティを true にします。

 

プラットフォーム
.NET Framework
Silverlight
Windows Phone
Windows ストア
Portable Class Library

参照
プロパティ変更とエラー情報の通知 (概念編)
INotifyPropertyChanged インターフェイス
INotifyCollectionChanged インターフェイス
INotifyDataErrorInfo インターフェイス
弱いイベント パターン

子要素をレンガのようにタイル状に敷き詰める

 
WPF や Silverlight でもカスタム コントロールを作成することができます。
今回は例として、子要素をレンガのようにタイル状に敷き詰めるためのレイアウト パネルを
カスタム コントロールとして作成します。
 
レイアウトをカスタマイズするためには、「2 段階レイアウト モデル」を理解しておく必要があります。
レイアウトの内部処理は、測定 (Measure) と配置 (Arrange) の 2 段階で実行されます。
  • 測定段階: 各要素が必要とするサイズを測定します。
  • 配置段階: 測定結果をもとに各要素が実際に配置されます。
 
具体的には、MeasureOverride メソッドおよび ArrangeOverride メソッドをオーバーライドして、
子要素を測定および配置するためのコードを記述します。
今回作成したいコントロールはレイアウト パネルなので、Panel を継承してクラスを作成します。
(UniformGrid に似た構造になります。)
 
BrickTile.cs

public class BrickTile : Panel
{
   
private int rows;

    public static readonly DependencyProperty ColumnsProperty
       
= DependencyProperty.Register("Columns", typeof(int), typeof(BrickTile),
           
new FrameworkPropertyMetadata(2, FrameworkPropertyMetadataOptions.AffectsMeasure),
            o
=> (int)o >= 2);

    public int Columns
    {
       
get { return (int)base.GetValue(ColumnsProperty); }
       
set { base.SetValue(ColumnsProperty, value); }
    }

    // 子要素のレイアウトに必要なサイズを測定します。
    protected override Size MeasureOverride(Size availableSize)
    {
        ComputeRows();
       
Size childAvailableSize = GetChildSize(availableSize);

        var children = InternalChildren.Cast<UIElement>().ToArray();
       
foreach (var child in children)
        {
            child
.Measure(childAvailableSize);
        }
       
double maxWidth = children.Length == 0 ? 0 : children.Max(e => e.DesiredSize.Width);
       
double maxHeight = children.Length == 0 ? 0 : children.Max(e => e.DesiredSize.Height);

        return new Size(Columns * maxWidth, rows * maxHeight);
    }

    // 子要素を配置します。
    protected override Size ArrangeOverride(Size finalSize)
    {
       
Size childFinalSize = GetChildSize(finalSize);

        int actualIndex = 0;
       
foreach (UIElement child in InternalChildren)
        {
           
var position = GetPosition(actualIndex);
           
Point childPoint = new Point
            {
                X
= (position.Item2 + (position.Item1 % 2 == 0 ? 0 : 0.5)) * childFinalSize.Width,
                Y
= position.Item1 * childFinalSize.Height,
            };
           
Rect childRect = new Rect(childPoint, childFinalSize);

            child.Arrange(childRect);

            if (child.Visibility != Visibility.Collapsed)
            {
                actualIndex
++;
            }
        }

        return finalSize;
    }

    // 行数を算出します。
    private void ComputeRows()
    {
       
int actualChildrenCount = InternalChildren.Cast<UIElement>()
           
.Count(e => e.Visibility != Visibility.Collapsed);

        if (actualChildrenCount == 0)
        {
            rows
= 0;
        }
       
else
        {
           
var lastChildPosition = GetPosition(actualChildrenCount  1);
            rows
= lastChildPosition.Item1 + 1;
        }
    }

    // 指定されたインデックスの子要素の (行番号, 列番号) を求めます。
    private Tuple<int, int> GetPosition(int index)
    {
       
// 2 行分を 1 グループとして、 (グループ番号, グループ内の位置) を求めます。
        int groupChildrenCount = 2 * Columns  1;
       
var groupedPosition = Tuple.Create(index / groupChildrenCount, index % groupChildrenCount);

        return Tuple.Create(2 * groupedPosition.Item1 + groupedPosition.Item2 / Columns,
            groupedPosition
.Item2 % Columns);
    }

    // 子要素のサイズを求めます。
    private Size GetChildSize(Size parentSize)
    {
       
return new Size(parentSize.Width / Columns, parentSize.Height / (rows == 0 ? 1 : rows));
    }
}


 
これで、子要素がレンガのようにタイル状に並ぶようになります。
 
Button (Expression Blend)
 
せっかくなので、これを使って九州の県を選択させるための UI を考えてみます。
まず、ListBox に ListBoxItem を追加して県名を設定します。
 
九州 (スタイル設定なし)
 
この何の変哲もない ListBox も、
次のように ItemsPanel プロパティを BrickTile に変更するだけで視認性の高い UI になります。
この XAML は Expression Blend で生成できます。

<Window x:Class="BrickTileTest.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
   xmlns:s="http://schemas.saka-pon.net/sample1&quot;
   Title="MainWindow" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type ListBox}">
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="ItemsPanel" Value="{DynamicResource ItemsPanelTemplate1}"/>
        </Style>
        <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
            <s:BrickTile IsItemsHost="True" Columns="3"/>
        </ItemsPanelTemplate>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="#FFC0F0B0"/>
            <Setter Property="BorderBrush" Value="#FF106020"/>
            <Setter Property="BorderThickness" Value="2"/>
            <Setter Property="Margin" Value="2"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="ContentTemplate" Value="{DynamicResource DataTemplate1}"/>
        </Style>
        <DataTemplate x:Key="DataTemplate1">
            <TextBlock Text="{Binding Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </DataTemplate>
    </Window.Resources>
    <ListBox>
        <ListBoxItem Content="長崎"/>
        <ListBoxItem Content="佐賀"/>
        <ListBoxItem Content="福岡"/>
        <ListBoxItem Content="熊本"/>
        <ListBoxItem Content="大分"/>
        <ListBoxItem Content="鹿児島"/>
        <ListBoxItem Content="宮崎"/>
    </ListBox>
</
Window>

 
九州 (スタイル設定あり)
 
また、この UI 上では矢印キーや PageUp / PageDown キーでフォーカスを移動できます。
[長崎] が選択されている状態で [↓] キーを押すと [熊本] に移動し、PageDown キーを押すと [鹿児島] に移動します。
 
他にもいろいろと応用できそうです。
 
東京 23 区
 
関八州
 
バージョン情報
.NET Framework 4
Silverlight 4
 
参照

XAML 上での XML 名前空間の使用

 
WPF や Silverlight で、自分で作成したクラスやカスタム コントロールを XAML 上に記述すると、
次のようなコードになると思います。
ここでは、CustomControlLibrary1.dll の CustomControlLibrary1 名前空間に
CustomControl1 クラスを作成しているものとします。
 
MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
    xmlns:my="clr-namespace:CustomControlLibrary1;assembly=CustomControlLibrary1"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <my:CustomControl1/>
    </Grid>
</
Window>


 
Visual Studio や Expression Blend でデザインする場合、
4 行目の名前空間プレフィックスの定義はこれらのツールで自動的に記述されるので、労力は大して問題になりません。
しかし、なるべくなら 2 行目や 3 行目と同様に、CLR 名前空間ではなく URI 形式の XML 名前空間を使用したいものです。
 
そこで、CustomControlLibrary1 プロジェクトの AssemblyInfo.cs に次のような属性を追加します。

[assembly: XmlnsDefinition("http://schemas.saka-pon.net/sample1&quot;, "CustomControlLibrary1")]
[assembly: XmlnsDefinition("http://schemas.saka-pon.net/sample1&quot;, "CustomControlLibrary2")]
[
assembly: XmlnsPrefix("http://schemas.saka-pon.net/sample1&quot;, "s")]

XmlnsDefinitionAttribute により、XML 名前空間と CLR 名前空間を関連付けます。
1 つの XML 名前空間に複数の CLR 名前空間を関連付けることができます。
また、XmlnsPrefixAttribute により、XML 名前空間に既定のプレフィックスを割り当てます。
ここで割り当てたプレフィックスは、
Visual Studio や Expression Blend でデザインするときに自動的に使用されるようになります。
 
最初に示した MainWindow.xaml は次のようになります。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
    xmlns:s="http://schemas.saka-pon.net/sample1&quot;
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <s:CustomControl1/>
    </Grid>
</
Window>


 
注意点
(1) 現在のアセンブリで定義された XML 名前空間を利用することはできません。
     上の例では MainWindow クラスと CustomControl1 クラスは別々のアセンブリ内に存在していますが、
     もし同一のアセンブリ内に存在する場合は CLR 名前空間を利用しなければなりません。
 
バージョン情報
.NET Framework 4
Silverlight 4
Visual Studio 2010 + Silverlight 4 Tools
Expression Blend 4
 
参照

Silverlight Business Application テンプレートの認証機能

Visual Studio 2010 の Silverlight 4 用のプロジェクト テンプレートの中に [Silverlight Business Application] というものがあります。
認証機能を含み、Silverlight で業務アプリケーションを構築する場合の全体像を示したテンプレートといえます。
しかし、このプロジェクトを作成して即座に実行しても、認証機能が正しく動作するわけではありません。
 
以下では、この認証機能が動作するのに必要な手順を示します。
ASP.NET メンバーシップを利用します。
SQL Server のインスタンスは localhost\SQLEXPRESS とし、[Business1] データベースが作成されているものとします。
  1. コマンド プロンプトを起動し、次のコマンドを実行する。

    set regsql=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe
    %regsql% -S localhost\SQLEXPRESS -E -d Business1 -A mrp


      → [Business1] データベースにテーブルがいくつか作成される。
  2. Visual Studio を起動する。
  3. [ファイル] – [新規作成] – [プロジェクト] をクリックし、
    テンプレートから [Silverlight Business Application] を選択して [OK] をクリックする。
      → ソリューションおよびプロジェクトが作成される。
  4. (1) BusinessApplication1.Web プロジェクトの Web.config をダブルクリックする。
    (2) <connectionStrings>, <membership>, <roleManager>, <profile> 要素を次のように構成する。



    ・・・ (省略) ・・・

      <
    connectionStrings>
        <add name="Business1ConnectionString"
          connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Business1;Integrated Security=True"
          providerName="System.Data.SqlClient" />
      </connectionStrings>

      <system.web>

    ・・・ (省略) ・・・

        <membership defaultProvider="Default" hashAlgorithmType="HMACSHA256">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </membership>

        <roleManager defaultProvider="Default" enabled="true">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </roleManager>

        <profile defaultProvider="Default">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
          <properties>
            <add name="FriendlyName" />
          </properties>
        </profile>

      </system.web>

    ・・・ (省略) ・・・


  5. [デバッグ] – [デバッグなしで開始] をクリックする。
      → 作成されたアプリケーションが起動する。
これで、とりあえずアプリケーションは完成です。
右上の [login] をクリックするとログイン画面が現れますが、まだユーザーを作成していないので左下の [Register now] をクリックします。
 
 
正常に入力したら [OK] をクリックします。
 
 
ユーザーの作成とログインが完了しました。
[Friendly name] の値は表示用に使用されます。
次回以降は、ログイン画面でユーザー名とパスワードを入力すればログインできます。
 
注意点
(1) aspnet_regsql.exe の -A スイッチでは、m はメンバーシップ、r はロール マネージャー、p はプロファイルを表します。
     他に、c (Web パーツのパーソナル化) および w (Web イベント) があります。
 
(2) aspnet_regsql.exe により作成されたテーブルを削除するには、-A の代わりに -R を使用します。
%regsql% -S localhost\SQLEXPRESS -E -d Business1 -R mrp -Q
     -Q は確認メッセージが表示されないことを示します。
 
(3) aspnet_regsql.exe により作成されたテーブルには、
     パスワードをハッシュ化したり、プロファイルのデータを特殊な形式に加工したりして格納しなければなりません。
     従って、あらかじめ初期データを (Excel などで) 自分で作成しておいてそのままインポートするというのは難しいです。
     初期データを作成する場合にも、このテンプレートの UserRegistrationService クラスにあるような
     コード (Membership.CreateUser メソッドなど) を利用するのがよいでしょう。
 
(4) ログインすると認証 Cookie が発行されますが、これは ASP.NET の通常の Web アプリケーションで発行されるものと同じです。
     従って、同じ BusinessApplication1.Web の中では Silverlight 以外のページ (.aspx ファイルなど) ともログイン状態が共有されます。
 
(5) <membership> 要素の hashAlgorithmType 属性に HMACSHA256 を指定しています。
     この属性を指定しない場合、パスワードに対する既定のハッシュ アルゴリズムとして SHA1 が使用されます。
     しかし SHA1 については脆弱性が指摘されており、より強度のあるアルゴリズムが推奨されるため、
     明示的に HMACSHA256 や SHA256 などを指定することが望ましいです。
     (SqlMembershipProvider のハッシュ アルゴリズムに詳細を記述しました。)
 
     なお、<membership> – <providers> – <add> 要素の passwordFormat 属性を指定することにより、
     ハッシュ化 (Hashed) だけでなく、平文そのまま (Clear) や暗号化 (Encrypted) といった手段も選べます。
     暗号化を利用する場合、<machineKey> 要素の decryptionKey 属性にキーを明示的に指定する必要があります。
 
(6) サービスに対する認証および承認が必要な場合には、ドメイン サービス クラスに対して次の属性を使用します。
  • RequiresAuthenticationAttribute: 匿名ユーザーでない (ログイン済である) ことを要求します。
    Web.config の <deny users="?" /> に相当します。
  • RequiresRoleAttribute: 特定のロールに属していることを要求します。
    Web.config の <allow roles="roleNames" /> に相当します。
     以下に例を示します。

[EnableClientAccess]
public class DomainService1 : DomainService
{
    [RequiresAuthentication]
    public string GetMessageForAuthenticatedUsers()
    {
        dynamic profile = HttpContext.Current.Profile;

        return string.Format("ようこそ {0} !", profile.FriendlyName);
    }

    [RequiresRole("UltimateUsers")]
    public string GetMessageForUltimateUsers()
    {
        dynamic profile = HttpContext.Current.Profile;

        return string.Format("ようこそ {0} 様 !!", profile.FriendlyName);
    }

}

 
バージョン情報
Silverlight 4
.NET Framework 4
Visual Studio 2010 + Silverlight 4 Tools
SQL Server 2005, 2008, 2008 R2
 
 

Silverlight 4 関連リンク

随時追記していきます。
 
製品情報
        最新バージョンをダウンロードできます。
 
開発環境
    Silverlight 4 ランタイム など。
    Visual Studio 2010 では既定で Silverlight 3 アプリケーションの開発が可能ですが、
    Silverlight 4 アプリケーションを開発するためにはこのアドインが必要です。
    このアドオンには、以下のものが含まれています。
        ・ Silverlight 4 開発者ランタイム
        ・ Silverlight 4 SDK
        ・ WCF RIA サービス 1.0
        ・ Silverlight 4 用の F# ランタイム
Silverlight Toolkit (ほぼ必須)
 
開発リファレンス
MSDN
            クラス ライブラリの説明と連携しています。
            WCF RIA Services が正式版でなかったときのものなので注意が必要です。
    Code Recipe
            ソースコードあり (アプリケーション名は MSStoreSample)。
            Silverlight 3 アプリケーションであり、WCF RIA Services を利用していません。
            ソースコードあり (アプリケーション名は MSStoreSample)。
            Silverlight 4 アプリケーションであり、WCF RIA Services を利用しています。
    MSDN マガジン
            ソースコードあり (アプリケーション名は ExpenseReport)。
            WCF RIA Services が正式版でなかったときのものなので注意が必要です。
            ソースコードあり (アプリケーション名は KharaPos)。
Silverlight 4 Training Kit (2010 年 4 月)
    Silverlight 4 Training (オフライン版)
        ソースコードあり。ビデオあり。
    Out of Browser に対応しています。
    ダウンロードに時間がかかるので、クライアントにインストールしておくと便利です。
 
Silverlight アプリケーション
    Twitter クライアントです。
    UX デザイン パターン集です。