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を提示してもらったおかげで以降発生なし。
開発者としては、やはり大枚叩いてでも開発環境は整えるべきだと実感した。
0 コメント:
コメントを投稿