locked
コントロールを動的に追加する方法 RRS feed

  • 質問

  • TopPageからContentControlを使用してUserControlを表示しています。

    this.Cont.Content = UserControl_A;

    UserControl_AにはTextBoxとButtonが存在し、

    UserControl_AのButtonが押されたとき、

    TopPageにUserControl_Aを一つずつ増やしていく方法はありませんでしょうか。

     

    TopPage.xaml---------------------------

    <StackPanel x:Name="Pnl1">

    <ContentControl x:Name="Cont"/>

    <!-- ボタンが押されるたびに<ContentControl x:Name="Cont"/>が増えていくイメージ -->

    </StackPanel>

    -------------------------------------------

    UserControl_A.xaml--------------------

    <StackPanel x:Name="Pnl2">

    <TextBox x:Name="txt" />

    <Button x:Name="btnAdd" Click="btnAdd_Click" Content="+" />

    </StackPanel>

    -------------------------------------------

    2010年3月26日 4:51

回答

  • とりあえずクリックされたというのを捕まえたいだけの場合は

    ※UserControl_A内

     

    public event EventHandler ButtonClick;
    
    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {
        this.ButtonClick(this, EventArgs.Empty);
    }

     

    ※TopPage内

     

    // 最初のUserControl_Aを追加する箇所
    
    UserControl_A ua = new UserControl_A();
    
    ua.ButtonClick += this.UserControl_ButtonClick;
    
    this.cont.Content = ua;
    
    // ~~~~~~~~~~~~~~
    
    private void UserControl_Click(Object sender, EventArgs e)
    {
        this.Pnl1.Children.Insert(
            this.Pnl1.Children.Count - 1 ,
            new UserControl_A());
    }

     

    直接ハンドルするのでなく

    btnAdd_ClickをUserControl_Aがハンドルしてそれを知らせるイベントを起こす

    TopPageがそれをハンドルする

    という流れが基本だと思います。

     

    コレクションのIndexを指定してAddする場合はInsertを使用します。

     

    しかし上記例の場合私なら

    <StackPanel x:Name="Pnl1">
        <StackPanel x:Name="Pnl2">
            <ContentControl x:Name="Cont" />
        </StackPanel>
        <TextBlock Text="---END----"/>
    </StackPanel>
    のようにIndexを意識しないで済むようにXAMLのレイアウトを変更する方法をとります。

     

    まぁ他の条件が見えないので勝手な妄想にすぎませんが…

     

    • 回答としてマーク sikake_chui 2010年3月29日 0:49
    • 回答としてマークされていない sikake_chui 2010年3月29日 0:50
    • 回答としてマーク sikake_chui 2010年3月29日 0:51
    2010年3月26日 8:38

すべての返信

  • 1.btnAddが押されたというイベントをUserControl_Aに定義

    2.TopPageでそのイベントをハンドルしてPnl1.ChildrenにUserControl_AをNewしてAdd

    という手順で実現可能だと思います。

    2010年3月26日 7:18
  • Pnl1.Children.Add(new UserControl_A());

    とすることによりUserControlの追加ができました、ありがとうございます。

     

    しかしUserControl_AのbtnAdd_ClickイベントをTopPage側でハンドルする方法がわかりません。

     

    また、質問内容に若干訂正が加わるのですが

    TopPage.xaml----------------------------

    <StackPanel x:Name="Pnl1" >

    <ContentControl x:Name="Cont" />

    <!-- 追加したい場所 -->

    <TextBlock Text="---------END----------" />

    <!-- Children.Add()ではここに追加される -->

    </StackPanel>

    --------------------------------------------

    上記のような場合、コントロールの追加する位置を指定することはできませんでしょうか。

     

    2010年3月26日 7:54
  • とりあえずクリックされたというのを捕まえたいだけの場合は

    ※UserControl_A内

     

    public event EventHandler ButtonClick;
    
    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {
        this.ButtonClick(this, EventArgs.Empty);
    }

     

    ※TopPage内

     

    // 最初のUserControl_Aを追加する箇所
    
    UserControl_A ua = new UserControl_A();
    
    ua.ButtonClick += this.UserControl_ButtonClick;
    
    this.cont.Content = ua;
    
    // ~~~~~~~~~~~~~~
    
    private void UserControl_Click(Object sender, EventArgs e)
    {
        this.Pnl1.Children.Insert(
            this.Pnl1.Children.Count - 1 ,
            new UserControl_A());
    }

     

    直接ハンドルするのでなく

    btnAdd_ClickをUserControl_Aがハンドルしてそれを知らせるイベントを起こす

    TopPageがそれをハンドルする

    という流れが基本だと思います。

     

    コレクションのIndexを指定してAddする場合はInsertを使用します。

     

    しかし上記例の場合私なら

    <StackPanel x:Name="Pnl1">
        <StackPanel x:Name="Pnl2">
            <ContentControl x:Name="Cont" />
        </StackPanel>
        <TextBlock Text="---END----"/>
    </StackPanel>
    のようにIndexを意識しないで済むようにXAMLのレイアウトを変更する方法をとります。

     

    まぁ他の条件が見えないので勝手な妄想にすぎませんが…

     

    • 回答としてマーク sikake_chui 2010年3月29日 0:49
    • 回答としてマークされていない sikake_chui 2010年3月29日 0:50
    • 回答としてマーク sikake_chui 2010年3月29日 0:51
    2010年3月26日 8:38
  • イベントのキャッチ・コントロールの追加ができました。

    Index指定せず追加すると管理が楽でした、使わせていただきます。

    ありがとうございます。

    2010年3月29日 0:49