0

次の基本クラスがあります。

public class BodyBase : UserControl
{

}

次に、次のようにそのベースを継承する2つのWPFユーザーコントロール(WelcomeBodyとSettingsBody)があります。

public partial class WelcomeBody : BodyBase
{
    public WelcomeBody()
    {
        InitializeComponent();
    }
}

また、このBaseBodyを反映するように各XAMLファイルを変更しましたが、問題はありません。デザイナーは元気で、各コントロールを問題なく編集できます。

次のように、BodyBaseをWPFフォームに配置しました。

 <my:BodyBase x:Name="ApplicationBody" SnapsToDevicePixels="True" Background="#FFAA1111" Panel.ZIndex="-99" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" />

次に、ボタンをクリックしました。

private void WelcomeClick(object sender, RoutedEventArgs e)
{
    MessageBox.Show("test");
    ApplicationBody = new WelcomeBody();
}

実行時にボタンをクリックするとメッセージボックスが表示され、メッセージボックスで[OK]をクリックすると何も起こりません。デバッグしましたが、例外はスローされません。機能しないという事実以外は何も問題はありません。

私は何が間違っているのですか?そのユーザーコントロールを切り替えるにはどうすればよいですか。

ありがとう!

4

3 に答える 3

1

ApplicationBodyは、「foo.g.cs」部分クラスで1回だけ初期化される「bodybase」コントロールへのコード生成参照です。コントロールを保持する親コンテナ(グリッドなど)には、「bodybase」コントロールへの異なる参照があります。「ApplicationBody」参照を置き換えると、グリッドは引き続き他の参照を使用し、元の「bodybase」コントロールを指しています。これが、変化が見られない理由です。「ApplicationBody」を変更した後、親コントロールの子要素を確認することで、これを自分で確認できます。

WPFでこれを行う適切な方法は、ContentPresenterを使用することです。

于 2012-06-20T03:46:34.703 に答える
0

これで、コンテナオブジェクトに割り当てられたその名前の既存のコントロールを使用できます。コンテナからコントロールを削除し、新しいコントロールをコンテナに追加してみてください。通常、XamlでUsercontrolを割り当てません。コントロール用のコンテナーを追加し、コンテナーの内外でアイテムを交換します。

コンテナがmyGridという名前のグリッドであると仮定します。

private void WelcomeClick(object sender, RoutedEventArgs e)
{
    MessageBox.Show("test");
    Thickness margin = ApplicationBody.Margin; //Preserve Usercontrol Location Unless it fills Container
    myGrid.Children.Remove(ApplicationBody);
    ApplicationBody = new WelcomeBody();
    ApplicationBody.Margin = margin;
    myGrid.Children.Add(ApplicationBody);
} 
于 2012-06-20T03:47:49.190 に答える
0

私がしなければなりませんでした

ApplicationBody.Content = new WelcomeBody();
于 2012-07-03T02:31:45.643 に答える