z-orderについて、驚愕の事実

Silverlightやとオブジェクトの表示の前後関係はコントロールがパネルに追加されている順番になります。後で追加されたほうが上に表示されます。

この前後関係を自前で Canvas.ZIndex っていう、Canvas の依存関係プロパティの ZIndex で指定することになります。で、 ZIndex は Canvas の依存関係プロパティなので、 Canvas 以外は有効じゃないんやとずーっと思い込んでいました。つまり Grid とかで子どもが Canvas.ZIndex を指定していても意味が無いと。


が、昨日試してみたらちゃんと前後関係入れ替えてくれました!驚愕です。ある意味、何をいまさらかもしれませんが、完全に信じ込んでしまってました。サンプルとかでも Canvas の下で使われてるんです。そりゃ思い込んでしまいます。


以下、コードと画像です。ブレンドで描いたのでXAMLが美しくないのはご容赦ください。

<Grid x:Name="LayoutRoot" Background="White">
  <Rectangle Margin="50,52,0,0" Fill="#FFFF0000" VerticalAlignment="Top" Width="166" Height="145" HorizontalAlignment="Left" Canvas.ZIndex="2"/>
  <Rectangle Margin="114,103,0,232" Fill="#FF0400FF" Width="166" HorizontalAlignment="Left" Canvas.ZIndex="1"/>
  <Rectangle Margin="176,165,298,170" Fill="#FFFFF700"/>
</Grid>

なぜに Canvas の ZIndex かが謎です。クラスの継承関係考えても気持ち悪いです。Panel の依存関係プロパティやったらしっくりくるのですが・・・。

まぁ、確かに MSDN にも Canvas でしか使えません。って書いてないのですが・・・。

Panel 内のオブジェクトの Canvas.ZIndex 添付プロパティを設定することで、重なる順番を変更できます。

まぁ、これであきらめてたことがいろいろ出来るっぽいので、嬉しいっちゃー嬉しいのですが複雑な気分です。。