ページ

2010年7月30日金曜日

[Silverlight] ビヘイビアーの開発 その1

ビヘイビアーを開発する際に必要となる基本的なところをまとめておきます。

■ ドキュメント
とりあえず、以下のヘルプファイルが入っているのは見つけました。
これらのファイルがいつ入ったのかまでは調べてませんが、名前的に考えて Expression Blend を入れたときだと思います。

※以下、”%PROGRAMFILES%” と表記していますが、64bit OS の場合は “%PROGRAMFILES(x86)%” になります。

Blend 3 (英語版) %PROGRAMFILES%\Microsoft SDKs\Expression\Blend 3\Help\en\BlendSDK.chm
Blend 4 (日本語版) %PROGRAMFILES%\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Help\ja\.NETFramework40BlendSDK.chm

また、Blend SDK は Microsoft のダウンロードサイトからダウンロードできますので、きっとそれにも入ってるんだと思います。(確認はしてませんが)

もっとも、このヘルプファイルにはちょっと不満が。。。
Blend 3 のやつはクラスのリファレンスが載ってるだけで解説なんかは全然ありません。
Blend 4 の方はちょっと解説なんかも増えてますが、「ビヘイビアーの追加の仕方」 みたいな Blend の使い方について数ページの解説があるだけで、ビヘイビアーの開発方法についてはほとんど何も説明がありません。「カスタムのトリガーとアクションの作成」 というページと 「カスタム ビヘイビアーの作成」 というページがそれぞれ 1ページづつあるだけみたいです。
英語のヘルプと日本語のヘルプとでは翻訳してあるだけで基本的に内容は同じみたいですし。。。
うーん、どっかにまともな開発用ドキュメントってあるんでしょうか?

■ 参照設定
Visual Studio で作った Silverlight プロジェクトの場合、ビヘイビアーの開発に必要となるアセンブリを手動で参照設定する必要があります。
Blend で作ったプロジェクトの場合は最初からこれらの参照設定が含まれています。どうやら以下のファイルが参照設定されているようです。

Blend 3 (英語版) %PROGRAMFILES%\Microsoft SDKs\Expression\Blend 3\Interactivity\Libraries\Silverlight フォルダの下
  • System.Windows.Interactivity.dll
  • Microsoft.Expression.Interactions.dll
Blend 4 (日本語版) %PROGRAMFILES%\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries フォルダの下
  • System.Windows.Interactivity.dll
  • Microsoft.Expression.Interactions.dll
  • Microsoft.Expression.Drawing.dll

ビヘイビアーの開発という意味では本当に必要なのは System.Windows.Interactivity.dll だけみたいです。Behavior<T> や TriggerAction<T> といったビヘイビアーの基本クラスとなるクラスなどがこれに含まれています。
Microsoft.Expression.Interactions.dll には標準で付いているビヘイビアー (ChangePropertyAction や PlaySoundAction といったもの) が入っているようです。
Blend 4 で増えた Microsoft.Expression.Drawing.dll には星とかのシェープが入っています。

■ ビヘイビアーの基本クラス
ビヘイビアーを開発する場合、Behavior<T>、TriggerAction<T>、TargetedTriggerAction<T> のいずれかを継承する必要があります。

■ Behavior<T>
もっともシンプルなビヘイビアーの基本クラスです。
サンプルコードは以下のようになります。

public class BehaviorSampleBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
    }

    void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("left button down");
    }
}

AssociatedObject プロパティにビヘイビアーが接続しているオブジェクトが格納されています。
ですので、アタッチのときにイベントハンドラを登録し、デタッチのときに削除する、というようにしてやると好きなイベントに反応することができます。

■ ジェネリック引数 T について
Behavior<T> の T ですが、これは 「どのオブジェクトに接続することができるのか」 を示していると考えるとわかりやすいです。
T を FrameworkElement か UIElement にしておけば 「何にでも接続できるビヘイビアー」 ということになります。(XAML に出てくる普通のオブジェクトはみんな FrameworkElement から派生したオブジェクトだから。Resource とかは違うかもですが、そういう特殊なやつはここでは横に置いておきます)
T を Button にすれば Button (と Button から派生しているもの) に接続できるビヘイビアーということになります。

Blend はきちんと T の型を見ています。
Blend でビヘイビアーをドロップしようとすると、マウスの下がドロップ不可のときは進入禁止マークになりますが、T が Button になっていると Button (と Button から派生しているもの) の上にマウスがある時だけドロップ可能になって、それ以外のときは進入禁止マークになります。

そして、もちろん AssociatedObject プロパティの型は T です。

[Silverlight] ビヘイビアーの開発 その2」 に続きます。

2010年7月29日木曜日

[ASP.NET] RSS を受け取って表示する ASP.NET のコード

勤め先の Web サイトで RSS を受け取って表示したいってことだったので、ちょこちょこっと書きました。

aspx は単に DataList を置いただけです。以下のような感じ。

<asp:DataList ID="DataList1" runat="server">
    <ItemTemplate>
        <asp:HyperLink ID="HyperLink1" runat="server"
            Target="_blank"
            NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "Link") %>'
            Text='<%# "[" + DataBinder.Eval(Container.DataItem, "Published", "{0:MM/dd HH:mm}") + "] " + DataBinder.Eval(Container.DataItem, "Title") %>'></asp:HyperLink>
    </ItemTemplate>
</asp:DataList>

aspx.cs で以下のよう DataList にデータバインドして表示します。

protected void Page_Load(object sender, EventArgs e)
{
    var rss = XElement.Load("http://shinichiaoyagiblog.divakk.co.jp/feeds/posts/default");
    var ns = XNamespace.Get("http://www.w3.org/2005/Atom");
    var titles = from entry in rss.Elements(ns + "entry")
                 select new
                 {
                     Published = DateTime.Parse(entry.Element(ns + "published").Value),
                     Title = entry.Element(ns + "title").Value,
                     Link = entry.Elements(ns + "link").Single(x => (x.Attribute("rel").Value == "alternate")).Attribute("href").Value,
                     Author = entry.Element(ns + "author").Element(ns + "name").Value
                 };

    this.DataList1.DataSource = titles.Take(5);        // 最初の 5件
    this.DataList1.DataBind();
}

Linq を使ってごく普通に RSS を取ってるだけです。
あぁ、RSS って書いてますが、上記は Atom 専用のコードになっちゃってます。
あと、例外なんかもまったく考慮してないので、そのあたりはもうちょっとちゃんとした方がいいかもしれません。

[ASP.NET] ASP.NET 4 と ASP.NET 1.x/2.0 を混在させる

最近 (ASP.NET 4 から?) は複数のバージョンの ASP.NET を一つの Web サイトでホストできるということで、それをやってみようとしたときの記録です。

サイトの構成を以下のようにしようとしました。

もともと .Text (C# で書かれたブログエンジン) が動いているところの親フォルダを ASP.NET 4 にしてみようとしたわけです。
OS は Windows Server 2003 の IIS6 です。
.NET Framework 4 をインストールしたらいつの間にか /blog/ の方も 4 になっていたので、以下の手順でマルチバージョンにしました。

  1. IIS マネージャの 「アプリケーションプール」 を右クリックして v1Pool という名前のプールを新規作成。
  2. IIS マネージャで仮想フォルダ blog を右クリックしてプロパティで 「アプリケーションプール」 を v1Pool に、「ASP.NET バージョン」 を 1.1.4322 にした。
  3. (ルートの方は始めから「アプリケーションプール」 が DefaultAppPool、「ASP.NET バージョン」 が 4.0.30319 になっていたのでそのまま)

ひとつのアプリケーションプールに違うバージョンを入れることはできません。マルチバージョンにしたいときはこのようにバージョン別にアプリケーションプールを作ってやれば OK です。

が、ここで問題発生。
blog フォルダの方は勝手に親フォルダの web.config を見にいっちゃうんですね。
もちろん、blog フォルダは Web アプリケーションにしてあるので独自に web.config を持ってるんですが、実行時に勝手に親フォルダの web.config も内容がチェックされてしまいます。
それで、親フォルダは ASP.NET 4 になってるので web.config も ASP.NET 4 のものになっています。それを ASP.NET 1.1 としてチェックしてしまうため (blog フォルダは ASP.NET 1.1 だから)「connectionString なんて知らね」 「targetFramework なんて知らね」 とかって感じで web.config が不正だというエラーになってしまいます。
この、親フォルダの web.config までチェックしにいっちゃうのって止められるんでしょうか?
ちょっと調べてみたところでは止め方がわかりませんでした。
今回の場合は、親フォルダは特に web.config に書かなくちゃいけないことは無かったので、中身をばっさりと削除して ASP.NET 1.1 と非互換な部分が無くなるようにしちゃいました。その結果、親フォルダの web.config のせいでエラーになることは無くなりました。

そして、次の問題が発生。
.Text では http://www.divakk.co.jp/blog/aoyagi/ のようにアクセスできるようになっています。aoyagi という名前のフォルダは実在しないのですが、うまいことマッピングして処理するようになっているんです。
ところが、実際にアクセスしてみると 「eurl.axd/xxxxxxxxxxxxxxxxxx が見つからない」 とかっていうエラーになります。
検索してみるとどうやらこちら。
http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770153
(日本語は [PDF]ASP.NET 4 の互換性に影響する変更点
一部抜粋してみると、

ASP.NET 4 を使うように構成されていると、拡張子なしの URL に eurl.axd を追加してしまう。ASP.NET 2.0 は eurl.axd を認識しないのでファイルが存在しないという例外が発生する。

ということだそうです。
解決法も書いてあるんですが、

  1. ASP.NET 4 を使うのをやめる
  2. ASP.NET 2.0 だけのサイトを別に作る
  3. レジストリを書き換えて eurl.axd を使わないようにする

うーむ。
今回は 3 の eurl.axd を使わないようにして対処しました。

一応、最初に意図した構成にはできましたが、ちょっとなんだかなぁという感じです。
ASP.NET のバージョンを混在させるのはいろいろと落とし穴がありそうですね。

2010年7月28日水曜日

[始めに] 技術系の記事を書くためのブログを作成しました

今まで http://shinichiaoyagi.blog25.fc2.com/ で技術系のことも趣味系のこともごちゃまでで書いてましたが、技術系専用のブログをここに立ち上げました。
ここでいう技術系っていうのは、Windows、.NET Framework、C#、VB、WPF、Silverlight といったもののことです。

見てもらったらわかるとおりここは http://shinichiaoyagiblog.divakk.co.jp/ と私の勤め先のドメイン ( http://www.divakk.co.jp ) の下になってます。(下というか、ドメイン内のホストですが)
けど、まぁ、これにはあんまり深い意味は無くて、普通に青柳個人が好き勝手に書くブログですし、もちろん、会社の公式ブログとかそういうのとも違います。

また、独自ドメインを使っていますが、バナーに出しているようにここは http://www.blogger.com/ です。
blogger.com は無料で独自ドメインを使えるとのことでしたのでお借りすることにしました。