1

これは最初は奇妙に聞こえるかもしれませんが、かなり単純です。このサービスにはwcfWebサービス(restful)があり、いくつかの一般的な「ユーザー」フィールドを設定しました。設定したフィールドの1つは、ユーザーが追加されるたびにインクリメントするuserIDです。すべての非常に単純なもの。

次に、消費するwpfアプリケーションがあります。Webサービスで上記のユーザーごとに、ボタンをクリックするだけで実行されるwpfアプリケーションでそれらのユーザーのそれぞれを保持するコンテンツを動的に設定します。これにより、グループボックスとテキストブロックが適切に配置されたコンテンツ領域が読み込まれます(これも非常に単純です)。私がそれらを保持するコンテナは、userIDを保持するGroupBox.Headerと、学生の名前と名前に等しいTextblockです。

そのようです:

private void button1_Click(object sender, RoutedEventArgs e)
        {

            if (string.IsNullOrEmpty(textBox1.Text))
            {
                PanelMainContent.Children.Clear();
                MainArea1.Children.Clear();
                string uriGroups = "http://localhost:8000/Service/Student";
                XDocument xDoc = XDocument.Load(uriGroups);
                var sortedXdoc = xDoc.Descendants("Student")
                               .OrderByDescending(x => Convert.ToDateTime(x.Element("TimeAdded").Value));
                foreach (var node in xDoc.Descendants("Student").OrderByDescending(x => Convert.ToDateTime(x.Element("TimeAdded").Value)))
                {

                    GroupBox groupbox = new GroupBox();
                    groupbox.Header = String.Format(node.Element("StudentID").Value);
                    App.Current.Properties["groupboxHeader"] = groupbox.Header;
                    groupbox.Width = 100;
                    groupbox.Height = 100;
                    groupbox.Margin = new Thickness(1);

                    Button btnFindStudent = new Button();
                    btnFindStudent.Click += this.btnGeneral_Click;
                    btnFindStudent.Name = Convert.ToString("btnViewStudent");
                    btnFindStudent.Tag = Convert.ToString("ViewStudent");
                    btnFindStudent.Content = Convert.ToString("View");
                    btnFindStudent.HorizontalAlignment = HorizontalAlignment.Right;
                    btnFindStudent.Height = 20;
                    btnFindStudent.Width = 36;

                    TextBlock textBlock = new TextBlock();
                    textBlock.Text = String.Format(node.Element("FirstName").Value + " " + (node.Element("LastName").Value));
                    textBlock.TextAlignment = TextAlignment.Center;

                    TextBlock textBlock1 = new TextBlock();
                    textBlock1.Text = (DateTime.Parse(node.Element("TimeAdded").Value)).ToString("d");
                    String.Format("{0:d/M/yyyy}", DateTime.Parse(node.Element("TimeAdded").Value));
                    textBlock1.TextAlignment = TextAlignment.Center;
                    textBlock1.VerticalAlignment = VerticalAlignment.Bottom;

                    StackPanel stackPanel = new StackPanel();
                    stackPanel.Children.Add(groupbox);
                    stackPanel.Children.Add(btnFindStudent);
                    stackPanel.Children.Add(textBlock);
                    stackPanel.Children.Add(textBlock1);
                    stackPanel.Margin = new Thickness(5);
                    stackPanel.MouseEnter += new MouseEventHandler(stackpanel_MouseEnter);
                    stackPanel.MouseLeave += new MouseEventHandler(stackpanel_MouseLeave);
                    MainArea1.Children.Add(stackPanel);
                }
            }

そして、出力は次のようになります。

ここに画像の説明を入力してください

GroupBox.headerUserIDの状態に注意してください。

だからこれは私に問題をもたらします...あなたが画像で気づいたら、私も動的にボタンを設定します(上のコード)。このボタンはThisUser:)という名前のユーザーコントロールアプリをロードしますが、私が抱えている問題は次のことができることです:

1)最初に、現在クリックされている学生のGroupBox.Header(UserID)を取得します(以下のDarinsの回答により解決)

2)そのUserIDをユーザーコントロール「ThisUser」に送信します

質問1)を説明するには:

上記のコードを見ると、クリックされたユーザーのgroubox.headerを「取得」する方法があります(アプリの画像の「表示」ボタン)

そして質問2)

どういうわけか、現在のアプリからユーザーコントロール「ThisUser」に「送信」するか、ユーザーコントロールが使用できるように「利用可能」にします。

これが素晴らしく、明確で、可能な限り最良の答えを提供するためにうまくレイアウトされていることを願っています。他に知りたいことがあれば(コード、説明)、遠慮なく質問してください。

btnGeneralClick(表示ボタン)でデータを送信するコード:

    public FindStudent()
    {
        InitializeComponent();
    }
    private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {

        ViewStudent myusercontrol = new ViewStudent();
        String id = (String)((Button)sender).Tag;
        myusercontrol.StudentID = id;
        PanelMainContent.Children.Add(myusercontrol);

    }

UserControl:

public partial class ViewStudent : UserControl
{

    public ViewStudent()
    {
        InitializeComponent();

    }
    private string _studentID;

    public string StudentID
    {
        get
        {
            return _studentID;
        }
        set
        {
            _studentID = value;
        }
    }
    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        groupBox1.Header = StudentID;
        //or
        textBlock1.Text = StudentID;
    }
}
4

1 に答える 1

1

まず、btnFindStudent.Tag に StudentID を入れます。

btnFindStudent.Tag = node.Element("StudentID").Value.ToString();

ClickEvent が発生すると、タグから ID を取得して、ThisUser UserControl に送信できます。

String id = (String)((Button)sender).Tag;

UserControl に "StudentID" というパブリック プロパティを作成し、そこに設定するだけです。UserControl を見ずに言うのは難しいです。:(

詳しくは:

これを ViewStudent に追加します。

#region StudentID

public static readonly DependencyProperty StudentIDProperty = DependencyProperty.Register("StudentID", typeof(String), typeof(ViewStudent), new PropertyMetadata(OnStudentIDChanged));

public string StudentID
{
    get { return (string)GetValue(StudentIDProperty); }
    set { SetValue(StudentIDProperty, value); }
}

static void OnStudentIDChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    (d as ViewStudent).OnStudentIDChanged(e);
}

void OnStudentIDChanged(DependencyPropertyChangedEventArgs e)
{
    groupBox1.Header = StudentID;
    textBlock1.Text = StudentID;
}

#endregion

そして、以前に作成した他の StudentID プロパティを取り除きます。

ViewStudent myUserControl = new ViewStudent();
myUserControl.StudentID = (String)((Button)sender).Tag;

それを試してみてください。(:

于 2012-04-19T17:12:37.357 に答える