0

null フィールドが原因でユーザー コントロールが起動せず、非常にイライラしています。コードは次のとおりです。

       public MyControl()
       {
        protected override void OnInitialized(EventArgs e)
        {
         base.OnInitialized(e);
         string userinputMainWindow = (string)App.Current.Properties["TextBoxString"];
         Foreach
         {
            TextBlock textBlock2 = new TextBlock();
            textBlock2.Text = String.Format(userinputMainWindow); // null
            textBlock2.TextAlignment = TextAlignment.Left;

しかし、これが必要だとは思いません。コードが起動時に初期化され、コードを呼び出すときにのみ初期化されるのをどのように停止できますか?

たとえば、メイン ウィンドウでは、次のようにユーザー コントロールを呼び出します。

    private Dictionary<string, UserControl> _userControls = new Dictionary<string, UserControl>();
    public Dictionary<string, UserControl> GetUserControls()
    {
        return _userControls;
    }
    public MainWindow()
    {
        InitializeComponent();

        List<string> userControlKeys = new List<string>();
        userControlKeys.Add("MyControl");
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        foreach (string userControlKey in userControlKeys)
        {
            string userControlFullName = String.Format("{0}.UserControls.{1}", type.Namespace, userControlKey);
            UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName);
            _userControls.Add(userControlKey, userControl);
        }

    }
    private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {

        App.Current.Properties["TextBoxString"] = textBox1.Text;

        PanelMainContent.Children.Clear();
        Button button = (Button)e.OriginalSource;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;

        PanelMainContent.Children.Add(_userControls[button.Tag.ToString()]);
    }

ユーザー コントロールの初期化を停止する方法はありますbtnGeneral_Clickか?

4

1 に答える 1

1

WPFでは、この種の処理は通常、データバインディングを介して行われますが、パネルに追加する前にユーザーコントロールにプロパティを設定するだけで、これをすばやく機能させることができます。

ユーザーコントロールにプロパティを追加します。

public string TextBlockString
{
    get
    {
        return this.textBlock2.Text;
    }

    set
    {
        this.textBlock2.Text = value;
    }
}

そしてbtnGeneral_Click

private void btnGeneral_Click(object sender, RoutedEventArgs e)
{

    App.Current.Properties["TextBoxString"] = textBox1.Text;

    PanelMainContent.Children.Clear();
    Button button = (Button)e.OriginalSource;
    Type type = this.GetType();
    Assembly assembly = type.Assembly;

    MyControl myControl = _userControls[button.Tag.ToString()];
    myControl.TextBlockString = textBox1.Text;

    PanelMainContent.Children.Add(myControl);
}
于 2012-04-18T14:56:15.283 に答える