2

http://i.stack.imgur.com/v58ov.png

上の写真を参照してください。これは、Visual Studio のオプション フォームのスクリーンショットです。

左側は基本的に TreeView です。右側には、プログラム オプションを変更するさまざまなコントロールがあります。TreeView のノードが選択されると、右側が変化し、さまざまなオプションが表示されます。

このようなものをどのようにプログラムしますか?右側には 50 個の重なり合うパネルがあり、ノードを選択すると表示されるパネルが変わるだけですか? このような場合、どのように管理しますか。それは設計者にとって混乱でしょう。

4

3 に答える 3

0

いくつかのオプションを確認した後、私のアプローチは、コントロールのページをページ パネルとして使用できるように TabControl コンポーネントを継承し、実行時にタブが表示されないように機能を追加することでした。次に、TabPages に依存する Pages というプロパティを作成することで、意味的に正しい方法で各ページを参照できます。これにより、すべてのページを Pages コレクションの一部として、またドキュメント エクスプローラーを介して階層的に管理できるという利点が得られます。

このコードは、通常の TabControl に関連するデザイン時プロパティも非表示にしますが、これはページ パネルでは関係ありません。以下は、誰かが興味を持っている場合のコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace MyCustomControls
{
    public class PagedPanel : TabControl
    {
        //------------------------------------------------------------------------------------------------
        public PagedPanel()
        {
            base.Multiline = true;
            base.Appearance = TabAppearance.Buttons;
            base.ItemSize = new Size(0, 1);
            base.SizeMode = TabSizeMode.Fixed;
            base.TabStop = false;
        }
        //------------------------------------------------------------------------------------------------
        protected override void WndProc(ref Message m)
        {
            // Hide tabs by trapping the TCM_ADJUSTRECT message
            if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1;
            else base.WndProc(ref m);
        }
        //------------------------------------------------------------------------------------------------
        protected override void OnKeyDown(KeyEventArgs ke)
        {
            // Block Ctrl+Tab and Ctrl+Shift+Tab hotkeys
            if (ke.Control && ke.KeyCode == Keys.Tab)
                return;
            base.OnKeyDown(ke);
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DefaultValue(true)]
        public new bool Multiline
        {
            get { return base.Multiline; }
            set { base.Multiline = value; Invalidate(); }
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)
        , DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DefaultValue(TabAppearance.Buttons)]
        public new TabAppearance Appearance
        {
            get { return base.Appearance; }
            set { base.Appearance = value; Invalidate(); }
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)
        , DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DefaultValue(typeof(Size), "0, 1")]
        public new Size ItemSize
        {
            get { return base.ItemSize; }
            set { base.ItemSize = value; Invalidate(); }
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)
        , DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DefaultValue(TabSizeMode.Fixed)]
        public new TabSizeMode SizeMode
        {
            get { return base.SizeMode; }
            set { base.SizeMode = value; Invalidate(); }
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)
        , DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public new TabPageCollection TabPages
        {
            get { return base.TabPages; }
        }
        //------------------------------------------------------------------------------------------------
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [DefaultValue(false)]
        public new bool TabStop
        {
            get { return base.TabStop; }
            set { base.TabStop = value; Invalidate(); }
        }
        //------------------------------------------------------------------------------------------------
        public TabPageCollection Pages
        {
            get { return base.TabPages; }
        }
        //------------------------------------------------------------------------------------------------
    }
}

ツリービューは、キーまたはインデックスのいずれかによって各タブを呼び出す処理を行いますが、これは比較的簡単な作業です。これを行うには、ツリー内のノードに「tvn」などのプレフィックスを付けて名前を付け、PagedPanel 内のページに同じ名前を付けますが、プレフィックス「pg」を付けます。したがって、ツリービューの AfterSelect イベントでは、必要なのは現在のノードの名前だけであり、どのページを表示するかがわかります。

于 2015-12-17T15:55:32.673 に答える