C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ツールストリップメニューのEnabled=False時の動作


(過去ログ 106 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■63169 / inTopicNo.1)  ツールストリップメニューのEnabled=False時の動作
  
□投稿者/ たま (1回)-(2012/07/30(Mon) 15:17:50)

分類:[VB.NET/VB2005 以降] 

教えてください。
VB2008で、メニューバー(MenuStrip)を利用していて、例えば、メニュー1の下には、次のようにToolStripMenuItemがぶら下がっているとします。

メニュー1
  └メニュー1-1
    └メニュー1-1-1
    └メニュー1-1-2
  └メニュー1-2
    └メニュー1-2-1
    └メニュー1-2-2
  └メニュー1-3

ここで、メニュー1-1のEnabledがFalseだとすると、メニュー1を開いた時、最初にマウスポインタがメニュー1-1の上を通過した時には
子のメニュー(メニュー1-1-1・メニュー1-1-2)が開くことはないのですが、マウスポインタがメニュー1配下の他のメニューの上を
行ったり来たりするうちに、Enabled=Falseであるはずのメニュー1-1の子メニュー(メニュー1-1-1・メニュー1-1-2)が表示されてしまいます。
Enabled=Falseのメニューの子メニューは開かないようにしたいのですが、どのようにすればよいのでしょうか?

引用返信 編集キー/
■63171 / inTopicNo.2)  Re[1]: ツールストリップメニューのEnabled=False時の動作
□投稿者/ shu (11回)-(2012/07/30(Mon) 17:09:58)
No63169 (たま さん) に返信
既知の問題で対応されていません。VB2010でも同じです。

回避サンプルです。この問題を回避するための処理しかしてないので
処理によりいろいろ追加が必要となると思います。

Public Class Form1
    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Dim Menu1_1 As New CMenuItem() With {.Text = "メニュー1-1"}
        Dim Menu1_2 As New CMenuItem() With {.Text = "メニュー1-2"}
        Dim Menu1_3 As New CMenuItem() With {.Text = "メニュー1-3"}
        M1ToolStripMenuItem.DropDownItems.Add(Menu1_1)
        Menu1_1.DropDownItems.Add("メニュー1-1-1")
        Menu1_1.DropDownItems.Add("メニュー1-1-2")
        Menu1_1.Enabled = False
        M1ToolStripMenuItem.DropDownItems.Add(Menu1_2)
        Menu1_2.DropDownItems.Add("メニュー1-2-1")
        Menu1_2.DropDownItems.Add("メニュー1-2-2")
        Menu1_2.Enabled = True
        M1ToolStripMenuItem.DropDownItems.Add(Menu1_3)

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim itm = M1ToolStripMenuItem.DropDownItems(0)
        itm.Enabled = Not itm.Enabled
    End Sub
End Class

Public Class CMenuItem
    Inherits ToolStripMenuItem

    Public Sub New()
        MyBase.new()
    End Sub

    Public Overrides Property Enabled As Boolean
        Get
            Return MyBase.Enabled
        End Get
        Set(value As Boolean)
            MyBase.Enabled = value
            For Each smenu In DropDownItems.OfType(Of ToolStripItem)()
                smenu.Available = value
            Next
        End Set
    End Property

    Public Overrides ReadOnly Property HasDropDownItems As Boolean
        Get
            If Enabled Then
                Return MyBase.HasDropDownItems
            Else
                Return DropDownItems.Count > 0
            End If
        End Get
    End Property

End Class

引用返信 編集キー/
■63180 / inTopicNo.3)  Re[2]: ツールストリップメニューのEnabled=False時の動作
□投稿者/ たま (2回)-(2012/07/31(Tue) 12:51:59)
shuさま、ありがとうございます。

> 既知の問題で対応されていません。VB2010でも同じです。

そうなのですか。
早速サンプルを試してみようと思います。ありがとうございました。

>処理によりいろいろ追加が必要となると思います。

この「処理」とは、例えばどのような処理を想定していますか?
(最近メニューを使ったばかりなので、おはずかしながら、全然思い浮かびません)
この点についても助言を頂けるとありがたいです。
引用返信 編集キー/
■63181 / inTopicNo.4)  Re[3]: ツールストリップメニューのEnabled=False時の動作
□投稿者/ shu (13回)-(2012/07/31(Tue) 12:59:23)
No63180 (たま さん) に返信

> この「処理」とは、例えばどのような処理を想定していますか?
> (最近メニューを使ったばかりなので、おはずかしながら、全然思い浮かびません)
> この点についても助言を頂けるとありがたいです。
とりあえずEnabledの実装にて
(1)1つ下の階層しか見ていないので孫メニューが存在した場合対応出来ていない。
(2)Availableを操作することにより子メニューを非表示にしているのでその他の条件による
 非表示と区別がつかない
というところでしょうか?他にもあるかもしれません。
引用返信 編集キー/
■63193 / inTopicNo.5)  Re[4]: ツールストリップメニューのEnabled=False時の動作
□投稿者/ たま (3回)-(2012/08/03(Fri) 15:15:25)
ご連絡が遅くなり申し訳ございません。
shuさま、ご解説ありがとうございました。
とりあえず、解決とさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -