Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2009/3/30 (月)

[] くるっと回る3Dエフェクト  くるっと回る3Dエフェクトを含むブックマーク  くるっと回る3Dエフェクトのブックマークコメント

WPF やるからには、くるっと回る3Dエフェクトをやってみたい。そういうのばかり宣伝しすぎたから WPF が避けられてるって話もあるけど、実際には使わなくても楽しいのでやってみたい。でも、3Dは全然知らないのでまずはくるっとまわるソースコードを探してみた。

  • Healthcare Prototype
    • http://windowsclient.net/downloads/folders/wpfsamples/entry3754.aspx
    • WPF 初期の MS によるデモ。古いマシンでは重すぎてパラパラマンガ状態だったけど、今のマシンでも重い(^^; こいつの罪は重いw
    • 縦に半分パタンと回転するのと、横に全体がくるんと回転してサイズも変わるエフェクトがみどころ。
  • Silverlight3 の Perspective 3D (PlaneProjection) を使ってカバーフロー

忘れられてなければ、いつか Perspective 3D が入るのかもしれません。とりあえず Healthcare を読んでみます。

kkamegawakkamegawa 2009/03/31 00:50 いやーそれよりも私はXBAPが忘れられた子になりそうでw。silverlight.netでもこんな投稿があるし。

http://silverlight.net/forums/t/3282.aspx

siokoshousiokoshou 2009/03/31 01:12 XBAP は私の中ではすでになかったことに…w

トラックバック - http://d.hatena.ne.jp/siokoshou/20090330

2009/3/27 (金)

[] PropertyChanged  PropertyChangedを含むブックマーク  PropertyChangedのブックマークコメント

日々、せっせとバグを作っている siokoshou です(^^;

注意喚起になればいいかなと思って、今日は自分のバグの恥さらしでも。

WPF の Binding で値の変更が反映されない問題が起きて、あーでもないこーでもないと長い時間かけて見つけた原因は、PropertyChanged イベントで上げてる文字列が間違ってたことでした…

高級言語/環境の C#/.NET だけど、こいつは文字列ベースでエラー検出しづらい弱点ですね。とか八つ当たりしてみるw

ufcppufcpp 2009/03/30 12:31 ポスト処理が必要なのが難点ですが、以下のようなものはいかがでしょうか。
http://zio3.net/blog/post/PostSharpe381a6INotifyPropertyChaned.aspx

標準でこういう機能が組み込まれるといいんですけどね。

siokoshousiokoshou 2009/03/30 20:02 PostSharp ってありましたね!昔試したけど忘れてました。でも、標準で欲しいですよね。

トラックバック - http://d.hatena.ne.jp/siokoshou/20090327

2009/3/24 (火)

[] Vista?  Vista?を含むブックマーク  Vista?のブックマークコメント

http://www.vista.si/

SilverlightでVistaのデスクトップもどきを再現してる!だいぶ古いデモらしいけど、よくやるーw

トラックバック - http://d.hatena.ne.jp/siokoshou/20090324

2009/3/23 (月)

[] Silverlight Toolkit の NumericUpDown, 0.1 + 0.1 + 0.1 + ...  Silverlight Toolkit の NumericUpDown, 0.1 + 0.1 + 0.1 + ...を含むブックマーク  Silverlight Toolkit の NumericUpDown, 0.1 + 0.1 + 0.1 + ...のブックマークコメント

昨日触れた NumericUpDown で気になるところが。Value (現在の値) と Increment (増分または減分する値) が double なんです。double って0.1を10回足しても 1 にならなかったり、n + 1 == n が真になったりするから怖い。何を言ってるのかわからねーと思うが(ry

実際に Increment を0.1にして10回クリックすると1.0になるので、コードを見てみるとこうなってました。

Value = (double)((decimal)Value + (decimal)Increment);

素直に decimal にすればよくね?(^^;

大丈夫そうな気がするけど、念のため double の中身をデコードしてビットを見てみます。

   1 0-01111111111(2^ 0)-1.0000000000000000000000000000000000000000000000000000
   1 0-01111111110(2^-1)-1.1111111111111111111111111111111111111111111111111111
   1 0-01111111111(2^ 0)-1.0000000000000000000000000000000000000000000000000000

読み方は、先頭の1が Console に double を表示した結果。おそらく ToString の結果。素直に値を表示してないんですね。面白いことになってきた!そして、ハイフン区切りで符号、指数部、仮数部。指数部は2の何乗という形で、仮数部は1以上2未満です。

1行目は「1.0」をデコードした結果。2行目は「0.1」を10回足した結果。あと一歩及ばず、おしいw 3行目は↑のいったん decimal に変換する方法で「0.1」を10回足した結果。これを見る限り、きれいな値になってます。

この形式の浮動小数点数では、0.1や0.2は循環小数になってしまいます。0.5はすっぱり1/2なのできれいに表せます。仮数部は1/2, 1/4, 1/8, ... と続いていきます。

 0.1 0-01111111011(2^-4)-1.1001100110011001100110011001100110011001100110011010
 0.2 0-01111111100(2^-3)-1.1001100110011001100110011001100110011001100110011010
 0.5 0-01111111110(2^-1)-1.0000000000000000000000000000000000000000000000000000

どうして decimal 使わないのかわからないけど、0〜100の範囲で0.1ずつ上下させるみたいな用途には問題なさげです。加速しないって別の問題があるけど(^^; だるい…

トラックバック - http://d.hatena.ne.jp/siokoshou/20090323

2009/3/22 (日)

[] WPF Toolkit, WPF Futures, Silverlight Toolkit  WPF Toolkit, WPF Futures, Silverlight Toolkitを含むブックマーク  WPF Toolkit, WPF Futures, Silverlight Toolkitのブックマークコメント

MIX09 にあわせてそれぞれの3月版がリリースされています。

Silverlight Toolkit はどんどん成長していくのに WPF のほうはたいして変わらないのはどういうことなんだろう…。Silverlight は 3β とか言ってるし。MS としては WPF より Silverlight に力を入れていくってこと?

Silverlight Toolkit の NumericUpDown が WPF にも欲しいんだけど、提供されませんねぇ。コントロール作ってる人たちは同じチームだそうですが。ちなみにちょこっといじれば WPF でも動きました。ライセンスも Ms-PL なので改造したものを WPF アプリに含んでも問題ないんじゃないかと思います、たぶん。

ufcppufcpp 2009/03/23 00:32 力の入れ具合は明らかにSilverlight重視ですよね。
今は、先にSilverlightでコントロールを作って、あとからそれをWPF移植って感じみたいです。

siokoshousiokoshou 2009/03/23 07:12 ですよね〜。やっぱりライバルがいると燃え上がる体質なんだw

トラックバック - http://d.hatena.ne.jp/siokoshou/20090322

2009/3/10 (火)

[] Binding チートシート  Binding チートシートを含むブックマーク  Binding チートシートのブックマークコメント

こんばんは、siokoshou です。子供のころ、子供向け教育番組の「テレビの前のよい子のお友達」ってのが誰のことかわかりませんでしたw そういうお約束は小さい子供には難しいと思いますです。

さて、WPF の Binding チートシートのご紹介。バインディングは奥深いし、文法もごちゃごちゃしててややこしいですよね。MSDN ライブラリでドキュメントを見ても、能書きが多くてイマイチです。それはそれで必要なんだけど、それだけじゃなくて、パッと一覧できる実用的なサンプルもたくさん載せるべきだと思います。

で、それに近いものを作っちゃった人がいて Lester's WPF blog で紹介されてたので、リンク張っときます。PDF です。3/11まではちょっと怖いけど(^^;

ひじょーーに便利!

[] DropShadowEffect 実験機  DropShadowEffect 実験機を含むブックマーク  DropShadowEffect 実験機のブックマークコメント

f:id:siokoshou:20090310210601j:image

DropShadowEffect のプロパティをリアルタイムにいじって試すコードです。手抜きだけど十分実用的。

WPF

<Window x:Class="Effects.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <UniformGrid Rows="2">
        <UniformGrid Columns="2">
            <Label>BlurRadius</Label>
            <TextBox Name="BlurRadius">5</TextBox>

            <Label>Direction</Label>
            <TextBox Name="Direction">315</TextBox>

            <Label>Opacity</Label>
            <TextBox Name="Opacity">1</TextBox>

            <Label>ShadowDepth</Label>
            <TextBox Name="ShadowDepth">5</TextBox>

            <Button Click="Button_Click">Reset</Button>
        </UniformGrid>        

        <Rectangle Width="50" Height="50" Fill="LightSteelBlue">
            <Rectangle.Effect>
                <DropShadowEffect BlurRadius="{Binding ElementName=BlurRadius, Path=Text}"
                                  Direction="{Binding ElementName=Direction, Path=Text}"
                                  Opacity="{Binding ElementName=Opacity, Path=Text}"
                                  ShadowDepth="{Binding ElementName=ShadowDepth, Path=Text}"
                                  />
            </Rectangle.Effect>
        </Rectangle>
    </UniformGrid>
</Window>

C#

using System.Windows;

namespace Effects
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click( object sender, RoutedEventArgs e )
        {
            this.BlurRadius.Text = "5";
            this.Direction.Text = "315";
            this.Opacity.Text = "1";
            this.ShadowDepth.Text = "5";
        }
    }
}
トラックバック - http://d.hatena.ne.jp/siokoshou/20090310

2009/3/8 (日)

[] AlternationConverter  AlternationConverterを含むブックマーク  AlternationConverterのブックマークコメント

AlternationConverter は IValueConverter の一実装で、リストボックスや表を縞々にするのによく使われますが、数→オブジェクト汎用のコンバータなので実はいろいろ便利です。

<AlternationConverter x:Key="IconConverter">
  <BitmapImage UriSource="Resources\hoge.png" CreateOptions="DelayCreation" />
  <BitmapImage UriSource="Resources\foo.png" CreateOptions="DelayCreation" />
  <BitmapImage UriSource="Resources\bar.png" CreateOptions="DelayCreation" />
</AlternationConverter>

<Image Name="image" Width="16" Margin="2,1"
  Source="{Binding Path=ImageIndex, Converter={StaticResource IconConverter}}" />

こうすると数から画像に変換できます。単純な配列から値を引くだけのコンバータを書かなくても済みます。

[] 縞々  縞々を含むブックマーク  縞々のブックマークコメント

ついでなので、縞々のサンプルも書いておきます。ぐぐればすぐ見つかるけど、それでも書いておきます。

f:id:siokoshou:20090308190220j:image

(昨日の T4 つながりw)

<AlternationConverter x:Key="BackgroundConverter">
  <SolidColorBrush>white</SolidColorBrush>
  <SolidColorBrush Color="#dee7f5" />
</AlternationConverter>

<Style x:Key="stripe" TargetType="{x:Type ListViewItem}">
  <Setter Property="Background" 
    Value="{Binding RelativeSource={RelativeSource Self},
      Path=(ItemsControl.AlternationIndex),
      Converter={StaticResource BackgroundConverter}}"/>
  <Setter Property="HorizontalContentAlignment" Value="Stretch"/> <!-- これは右揃えのため -->
</Style>

...

<ListView ItemsSource="{Binding}"
          AlternationCount="2"
          ItemContainerStyle="{StaticResource stripe}">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
      <GridViewColumn Header="Point">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <TextBlock TextAlignment="Right"
              Text="{Binding Path=Point}" />
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

AlternationConverter で数に対応するブラシを定義。例では0なら白、1なら#dee7f5。二色を指定して、交互に色を変えます。数→色という対応さえできれば何色でもできます。単純に対応できなければ、この例をヒントにコンバータを書けばできると思います。

ListView というか GridView を縞々にするので、ListViewItem の背景を設定するスタイルを定義。RelativeSource はなかなかややこしい。WPF の外側のきらびやかなイメージを支える内臓とか血管みたいなもの。かなりグロテスク。

閑話休題。最後に ListView に AlternationCount を設定。二色の交互なので2を設定。ItemContainerStyle に ListViewItem に対するスタイルを設定して終了。AlternationIndex が 0,1 と交互に繰り返すことで背景色に変換されます。

参考: いつも参考にさせていただいております(^^)

トラックバック - http://d.hatena.ne.jp/siokoshou/20090308

2009/3/7 (土)

[] Binding の StringFormat のスニペット  Binding の StringFormat のスニペットを含むブックマーク  Binding の StringFormat のスニペットのブックマークコメント

via http://blogs.msdn.com/llobo/archive/2008/05/19/wpf-3-5-sp1-feature-stringformat.aspx

.NET3.5 SP1から追加された Binding の StringFormat のスニペットが載ってます。こんな書き方ができたなんて知らなかった…。全部の書き方知ってた?このドキュメントは、そのまま MSDN に収録すべき!

ItemStringFormat, ContentStringFormat, HeaderStringFormat なんてものあるようで。

以下、ポイントだけ引用。

<TextBox Text="{Binding Path=Double, StringFormat=F3}"/>
<TextBox Text="{Binding Path=Double, StringFormat=Amount: {0:C}}"/>
<TextBox Text="{Binding Path=Double, StringFormat=Amount: \{0:C\}}"/>
<TextBox>
  <TextBox.Text>
    <Binding Path="Double" StringFormat="{}{0:C}"/>
  </TextBox.Text>
</TextBox>

[] Snoop  Snoopを含むブックマーク  Snoopのブックマークコメント

http://blois.us/Snoop/

WPF アプリを作るのに必須のツール、だと思います。WPF アプリのコントロールの階層を覗くことができます。思ったところに枠線が引けないんだけど?みたいなときにこれを使って、あーここにこんなコントロールが入っててマージンが取られてるのかー、みたいに使います。WPF は WPF なりに苦労しますよね…。

そんなことはどうでもよくて、x64だと配布されてるバイナリーでは動かないけど、ソースを落としてx64でビルドするだけでx64環境でも動きました、というメモでした。まじで Snoop なしの開発なんて無理だと思う。やべ、Snoop 動かねーよ、x64環境捨てるか?と一瞬思ったほど重要なツール。

[] Text Template Transformation Toolkit  Text Template Transformation Toolkitを含むブックマーク  Text Template Transformation Toolkitのブックマークコメント

久しぶりなのに一気にメモってるのは、データが吹っ飛んで、やっぱりメモはネットに書いとこうと思ったから。メモでいいんです、メモで。

本題。Visual Studio 2008 には、こっそりとテンプレートエンジンが入っています。なぜこっそりなのかはわかりませんが、きっと面倒だったんだw

拡張子「.tt」のファイルに VS が反応するので確かに入っています。ツール→オプションにテキストテンプレートって項目があるので確かに入っています(使い始めるときっと False にしたくなる)。でも、かなり中途半端。

その名は Text Template Transformation Toolkit。T4とか呼ばれてます。だだんだんだだん♪

VS2005 のときの DSL ツールキットだったかなんだったかの一部のようです。NyaRuRu さんに教えてもらった「?.」演算子が Java7 に入るそうなので、じゃあ C# に勝手に追加してみようと思って T4 をいじってみたけど、そういう用途には向かなかったので、ちょっと遊んだだけで終了しました。なので詳しくは↓を見てください。スパムの大量生産にうってつけのツールです(^^;

http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

?. だけじゃなく、?[] もあるといいなぁ。a = list?[5]; とすると Null チェックと Length/Count のチェックをしてから、list[5] を読むっての。どっちかでひっかかったら null。

T4 がだめなら、csc.exe をラップしてしまえばできるかな?と思ったけど、インストーラに修復されてラッパーが消されてしまいそうなので、無理かもしれない。とか思ってるうちにやる気が失せたのできっとやりません(^^;

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |