6

VS2008で単純なユーザーコントロール(WPFではない)を作成しようとしています。これはSplitContainer、ボタンを押すとPanel1Panel2Collapsedプロパティを切り替えて、コントロールのサイズを。のサイズに変更しますPanel1

コントロールの要点は次のとおりです。

private int _openHeight;
private int _closedHeight;

public MyUserControl(bool open)
{
  InitializeComponent();

  _openHeight = this.Height;
  _closedHeight = splitContainer1.SplitterDistance;
  Open = open;  
}    

private bool _open;
private bool Open
{
  get { return _open; }
  set 
  { 
    _open = value;
    splitContainer1.Panel2Collapsed = !_open;
    this.Height = _open ? _openHeight : _closedHeight;
  }
}

private void button1_Click(object sender, EventArgs e)
{
  Open = !Open;
}

問題はthis.Height、ランタイムでは、メインフォームのデザイナでデザイン時に設定される値ではなく、ユーザーコントロールデザイナでコントロールが設定される値であるということです。

どんな助けでも大歓迎です。

アップデート

Lucasのソリューションに続いて、この方法は、_openHeightが1回だけ設定されることを意味し、目的の効果が得られます。

private int? _openHeight;
private int _closedHeight;

public MyUserControl(bool open)
{
  InitializeComponent();

  //the _closedHeight doesn't change so can be defined in the constructor
  _closedHeight = splitContainer1.SplitterDistance;

  //set value
  Open = open;  

  this.SizeChanged += new EventHandler(MyUserControl_SizeChanged);
  this.Load += new EventHandler(MyUserControl_Load);
}    

void MyUserControl_SizeChanged(object sender, EventArgs e)
{
  //this event is called BEFORE the _Load event so gets the height set in the designer
  //  and not any changes at run time (e.g. when you collapse the control)

  if (_openHeight == null)
    _openHeight = this.Height;
}

private bool _open;
private bool Open
{
  get { return _open; }
  set 
  { 
    _open = value;

    if (_open)
    {
      //sets height only if it has been initialized
      if (_openHeight != null)
        this.Height = (int)_openHeight;
    }
    else
    {
      this.Height = (int)_closedHeight;
    }
  }
}

void MyUserControl_Load(object sender, EventArgs e)
{
  //now that control is loaded, set height
  Open = Open;
}

private void button1_Click(object sender, EventArgs e)
{
  Open = !Open;
}
4

1 に答える 1

5

コントロールのHeightプロパティをコンストラクターで読み取っています。これは、おそらくフォームに表示される前であることを意味します。つまり、コントロールをフォームに表示する必要がある場合は、サイズが調整されているようです。この前は、コントロールのデザイナで設定された値であり、現在取得しています。

Heightこの問題を解決する最も簡単な方法は、コントロールがすでにフォームに描画されていることを確認したときに値を読み取ることです。つまり、コントロールのコンストラクターからパラメーターを取得し、初期化openする新しいメソッドを追加して、次の場合に呼び出すことができます。フォーム。Open_closedHeightLoad

このようなもの:

public MyUserControl()
{
    InitializeComponent(); 
}

public AdjustControlSize(bool open)
{
    _openHeight = this.Height;
    _closedHeight = splitContainer1.SplitterDistance;
    Open = open; 
}

//the rest of the control's code is unchanged
...

次にAdjustControlSize、フォームのLoadイベントからメソッドを呼び出します。

イベントメカニズムを備えたソリューション

コントロール自体のイベントを使用して、必要に応じて読み取ることもできHeightます。Formこのように、のコードで何も変更する必要はありません。

したがって、この場合、コードは次のようになります(ただし、これはテストしていません)。

public MyUserControl(bool open)
{
    InitializeComponent();

    _openHeight = this.Height;
    _closedHeight = splitContainer1.SplitterDistance;
    Open = open;
    this.SizeChanged += new EventHandler(MyUserControl_SizeChanged);
}

void CustomPictureBox_SizeChanged(object sender, EventArgs e)
{
    _openHeight = this.Height;
    _closedHeight = splitContainer1.SplitterDistance;
}

このようにして、コントロールはサイズが変更されるたびに自己調整できます。

于 2012-04-25T17:14:56.083 に答える