2009年4月17日金曜日

【徒然】あと半月程更新が滞ります

デスマーチだったり失恋したり引越ししたりとあれこれグダグダなのでしばらく更新はサボります。
WPFのデータバインディングについて、ノウハウ(BK含めて)溜まってきたので、今の仕事がけりついたら少しずつ書いていく予定です。

2009年4月7日火曜日

【開発】WPF:Styleプロパティの奇妙な振る舞い



ResourceDictionary内でx:Keyを指定せずに(つまり対象のTargetType全てに適用されることを期待)Styleを設定しても、対象となる最初のオブジェクトに対して適用されない事象が発生。
特異事象かどうか調べるためにサンプルソリューションを作ったところ見事に再現。
ビジュアルデザイナだとStyleが適用されてるんだけどねぇ。

サンプルソース(コード側では特に何もしてないのでxamlのみ)


<Window x:Class="StyleScopeSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="133" Width="480">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Background" Value="LightGray"/>
                    </Style>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <StackPanel Orientation="Horizontal">
        <StackPanel Orientation="Vertical">
            <TextBlock Name="tbk11">TextBlock11</TextBlock>
            <TextBlock Name="tbk12">TextBlock12</TextBlock>
            <TextBlock Name="tbk13">TextBlock13</TextBlock>
            <TextBlock Name="tbk14">TextBlock14</TextBlock>
            <TextBlock Name="tbk15">TextBlock15</TextBlock>
            <TextBlock Name="tbk16">TextBlock16</TextBlock>
        </StackPanel>
        <StackPanel Orientation="Vertical" >
            <StackPanel.Resources>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Foreground" Value="Red" />
                            </Style>
                        </ResourceDictionary>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </StackPanel.Resources>
            <TextBlock Name="tbk21">TextBlock21</TextBlock>
            <TextBlock Name="tbk22">TextBlock22</TextBlock>
            <TextBlock Name="tbk23">TextBlock23</TextBlock>
            <TextBlock Name="tbk24">TextBlock24</TextBlock>
            <TextBlock Name="tbk25">TextBlock25</TextBlock>
            <TextBlock Name="tbk26">TextBlock26</TextBlock>
        </StackPanel>
        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary>
                            <Style x:Key="tbkStyle1" TargetType="{x:Type TextBlock}">
                                <Setter Property="Foreground" Value="Blue" />
                            </Style>
                        </ResourceDictionary>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </StackPanel.Resources>
            <TextBlock Name="tbk31">TextBlock31</TextBlock>
            <TextBlock Name="tbk32">TextBlock32</TextBlock>
            <TextBlock Name="tbk33" Style="{StaticResource tbkStyle1}">TextBlock33</TextBlock>
            <TextBlock Name="tbk34">TextBlock34</TextBlock>
            <TextBlock Name="tbk35">TextBlock35</TextBlock>
            <TextBlock Name="tbk36">TextBlock36</TextBlock>
        </StackPanel>
        <StackPanel Orientation="Vertical">
            <TextBlock Name="tbk41">TextBlock41</TextBlock>
            <TextBlock Name="tbk42">TextBlock42</TextBlock>
            <TextBlock Name="tbk43">TextBlock43</TextBlock>
            <TextBlock Name="tbk44">TextBlock44</TextBlock>
            <TextBlock Name="tbk45">TextBlock45</TextBlock>
            <TextBlock Name="tbk46">TextBlock46</TextBlock>
        </StackPanel>
        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary>
                            <Style x:Key="tbkStyle1" TargetType="{x:Type TextBlock}">
                                <Setter Property="FontSize" Value="15" />
                            </Style>
                            <Style x:Key="{x:Type TextBlock}" TargetType="{x:Type TextBlock}">
                                <Setter Property="Foreground" Value="DarkOrange" />
                            </Style>
                        </ResourceDictionary>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </StackPanel.Resources>
            <TextBlock Name="tbk51">TextBlock51</TextBlock>
            <TextBlock Name="tbk52">TextBlock52</TextBlock>
            <TextBlock Name="tbk53" Style="{StaticResource tbkStyle1}">TextBlock53</TextBlock>
            <TextBlock Name="tbk54">TextBlock54</TextBlock>
            <TextBlock Name="tbk55">TextBlock55</TextBlock>
            <TextBlock Name="tbk56">TextBlock56</TextBlock>
        </StackPanel>
        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary>
                            <Style x:Key="{x:Type TextBlock}" TargetType="{x:Type TextBlock}">
                                <Setter Property="Foreground" Value="Green" />
                            </Style>
                        </ResourceDictionary>
                        <ResourceDictionary>
                            <Style x:Key="tbkStyle1" TargetType="{x:Type TextBlock}">
                                <Setter Property="Background" Value="Yellow" />
                            </Style>
                        </ResourceDictionary>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </StackPanel.Resources>
            <TextBlock Name="tbk61">TextBlock61</TextBlock>
            <TextBlock Name="tbk62">TextBlock52</TextBlock>
            <TextBlock Name="tbk63">TextBlock63</TextBlock>
            <TextBlock Name="tbk64">TextBlock64</TextBlock>
            <TextBlock Name="tbk65" Style="{StaticResource tbkStyle1}">TextBlock65</TextBlock>
            <TextBlock Name="tbk66">TextBlock66</TextBlock>
        </StackPanel>
    </StackPanel>
</Window>



埒が明かんので、Microsoft Connectに投稿したところ、Visual Studio 製品チームが精査してくれるとの事。

それにしてもVisualStudioに関しては、本当にMicrosoftの対応が的確かつ早くて助かる。
これの1個前に遭遇した、肥大化したResourceDictionary(内部でBasedOnを使用して継承している箇所も多数)を操作中にVSがハングする事象は本当に困り果ててて仕方なしにテキストエディタで編集してところを、対応したHotfixを提示してもらったおかげで以降発生なし。

開発者としては、やはり大枚叩いてでも開発環境は整えるべきだと実感した。

2009年4月6日月曜日

【開発】思い込みって怖いね、という罠

GDD Blog: [.NET]カレントディレクトリがかわってしまう?

ヘルプファイル作成のために、後輩にあれこれ操作してもらってたら発生。
設定ファイル類を相対パス指定位置で配置してたからいきなりホゲって焦った。
ま、エラーハンドリングが足りてないのは否めないけどね。
考えてみれば、Firefoxはダウンロード/アップロードで同じディレクトリを使ってるから多分カレントディレクトリなんだろうし、MSペイントは逆に、保存場所がマイピクチャ固定だから納得はいくんだけど、開発側としては「カレントディレクトリは動かない」って固定概念に縛られてるんだなぁ、と認識した次第。