次の方法で共有


WPF コントロールを前面に表示したい

質問

2019年7月6日土曜日 7:28

時間の掛かる処理を行う場合に、ListBoxの前面にLabelを表示させたいと思います。

 <Grid x:Name="grid1" Background="#FFF5E9E9" Margin="0" >
        <Label x:Name="Label101" Content="  お待ち下さい・・・・・" HorizontalAlignment="Left" Height="48" Margin="71,190,0,0" VerticalAlignment="Top" Width="351" Padding="0" FontSize="20"  VerticalContentAlignment="Center" Visibility="Hidden">
         </Label>
        <ListBox x:Name="ListBox1" Margin="13,51,13,326"  TabIndex="1"/>
    </Grid>

ところが、ListBoxが前面に表示されるのでLabel.Visibility=Visibleにしても見えません。
コントロールのZ-indexを制御するにはどうすれば良いのですか。
言語はVB.netでの回答をお願いします。

すべての返信 (4)

2019年7月6日土曜日 23:08 ✅回答済み | 1 票

Panel.ZIndex添付プロパティを指定しないのであれば、XAML定義で弟の方ほど手前になります。

Labelは、既定では背景色は透明です。そのためLabelを表示してもListBoxは消えず、ListBox上に文字が重なった表示になります。これを避けるためには、Labelの背景色を設定するか、またはListBoxのVisibilityをHiddenなどに変更するか、のいずれかが必要です。

ちなみに背景色をシステムの規定色に設定するには、Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" を使用できます。


2019年7月6日土曜日 7:51

LabelとListBoxの記述の順番を入れ替えてもLabel.Visibility=Visibleが効きません。

GUIに制御が移らないようです。Acync/Awaitで非同期処理をする様にしていますが動作しません。時間の掛かる動作は一切やっていません。動作状況の詳細など、分かり次第報告します。


2019年7月8日月曜日 8:11

>Panel.ZIndex添付プロパティを指定しないのであれば、XAML定義で弟の方ほど手前になります。
GridにはZIndex添付プロパティーが無いので、コードで記述するのは諦めます。手前に表示させたいコントロールをXAMLで下の方に記述することにします。

Me.Label101.Visibility = Visibility.Visible を実行してもすぐに描画がされないのは、

 Await Task.Run(Sub() 'この下の処理が重く?、UIに制御が移らない
                               重い処理() ’←1つのメソッドとしてまとめ、外に出した
   End Sub)

↑これで一応の解決を見ました。

決して重い処理を行ってはいないのですが、こうしないとUIに制御が移らない現象が発生するのだということがわかりました。
今回も御回答ありがとうございました。


2019年7月8日月曜日 8:22 | 1 票

GridにはZIndex添付プロパティーが無いので、コードで記述するのは諦めます。

? GridはPanelの派生クラスですから、ZIndex添付プロパティを持っていますよ。

添付プロパティは、XAMLでは

<Label Panel.ZIndex="1" ...>

C#からは

Panel.SetZIndex(label1, 1);

のように記述します。