« [P19] WPF:コンテント・コントロール(Button)にイメージ(Bitmap)を表示する | トップページ | [P22] WPF: Grid の ShowGridLines の非実用性を補う方法 »

[P21] WPF: Canvas の非排他性特性と同一表示空間での重複記載

Canvas の非排他性特性とは、『その(Canvas という)コンテナ内の表示空間を
占拠する内容物(Label, TextBlock 等)の、表示空間の占拠の仕方が
相互に非排他的であって、重複的に存在できる(重ねて表示できる)という特性』です。

    [注] Microsoft による正式概念ではなく、私が勝手に作り出した用語です。
            
           なお、この特性は、GDI時代の描画機構ではあたりまえだったことであり、
     WPF下ではCanvas上に限られることになったために、このように仰々しく位置
     づけているに過ぎません。


  他の一般的コンテナと異なり、唯一 Canvas だけには、この特性が与えられているということを意識しておくことは、何らかの役に立つことになると思われます。

すなわち、StackPanel のような、Canvas 以外の一般的コンテナの場合には、
その内部を占拠する内容物(Label, TextBlock 等)とコンテナ自身(StackPanel)とは、
コンテナ(StackPanel)が下(後)で、内容物(Label, TextBlock 等)が上(手前)
という形で、同一表示空間において重なるけれども、
コンテナ(StackPanel)内の内容物どうし(label_1 とlabel_2, あるいは label と textblock)は、コンテナ(StackPanel)の Alignment 特性に応じて必ず、Horizontal か Vertical かに排他的に並べて表示されることになり、同一表示空間においては決して重なることはない(=重ねることはできない)。

ところが、Canvas 内においてのみ、その内容物どうし(label_1 とlabel_2, あるいは label と textblock)は、同一表示空間において重なる(=重ねることができる=非排他的)のである。

[C#]
       Canvas canvas = new Canvas();
       canvas.Background = Brushes.AliceBlue;
      // canvas が、上位の何の子要素であるかは省略
 
       //同一サイズのラベル二つを作り、canvas の中に入れる(子要素とする)。      
        Label[] lbl = new Label[2];

        for (int i=0;i<lbl.Length;i++)
        {
            lbl[i] = new Label();
            canvas.Children.Add(lbl[i]);
            lbl[i].Width=100;
            lbl[i].Height=30;
            lbl[i].Background = Brushes.Transparent;//これが重要
        }
    
        // 二つのラベルを同一位置に配置する
        lbl[0].Content = "abc"; Canvas.SetLeft(lbl[0], 60); Canvas.SetTop(lbl[0], 50);
        lbl[1].Content = "xyz"; Canvas.SetLeft(lbl[1], 60); Canvas.SetTop(lbl[1], 50);

    // このコードを実行すると、同位置に abc と xyz が重なって表示される。

同サイズ・同表示空間に重ねて表示した lbl[0] と lbl[1] は、相互に排除し合わず併存するので、
両者の Background を Brushes.Transparent にして、視界を遮らないようにさえすれば、透過的に重ねて表示される(重ねて表示できる)。

実際に重なってしまうと、何が表示されているかわからないが、
表示位置を相互にづらして判別できるように配置すれば、
このような扱い方が意味を持ってくる局面がいろいろあると考えられます。

次の、・  ・ [P22] WPF: Grid の ShowGridLines の非実用性を補う方法 ・ ・ は、
ここから発見した方法です。
http://hokkai53.cocolog-nifty.com/blog/2008/09/grid-showgridli.html

以上

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

|

« [P19] WPF:コンテント・コントロール(Button)にイメージ(Bitmap)を表示する | トップページ | [P22] WPF: Grid の ShowGridLines の非実用性を補う方法 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« [P19] WPF:コンテント・コントロール(Button)にイメージ(Bitmap)を表示する | トップページ | [P22] WPF: Grid の ShowGridLines の非実用性を補う方法 »