none
WPF TreeView控件的问题,急等!!! RRS feed

  • 问题

  • 我是在代码中动态生成的TreeView,先在页面上new一个空的TreeView,然后根据逻辑后台建立一个TreeNode,再把TreeNode加到这个TreeView里去。现在的问题是,我想要在这种方式下在每一个节点里都加一个控件,例如TextBlock之类,不知道是否能达到。

    我知道在TreeViewItem里可以做到,但是TreeNode行吗?如果不行,有没有曲线救国的办法?谢谢大家!!!

    2011年1月20日 3:05

答案

  • 你好 雕刻_时光,

    我看了你的第一个问题,和你给Bob的回复, 我想我已经明白了你的需求。

    我现在很困惑的是:你为什么要在一个WPF的项目中添加一个Winform的控件,然后又打算像使用WPF一样去在WinForm的控件中添加另一个控件,这样本来就是一个很复杂的需求,你必须要对WinForm中的TreeNode进行重绘,这是一个很复杂的实现方式。

    你能告诉我,你必须以这种方式实现的原因么?

    针对你的需求,我想WPF中的TreeView实现起来是很简单的,在WPF中的Treeview的结点中添加一个TextBox是很容易的,你可以考虑用这种方式去完成你的项目。

    我根据你的需求给你写了一个直接运行的例子,你可以参考一下,下载地址是:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/For%20%e9%9b%95%e5%88%bb%5E_%e6%97%b6%e5%85%89/WPFTreeViewTutorial.rar

    你运行这个程序,然后在TextBox输入框中输入内容,点击AddItem,然后你就会加入一个TextBox控件。

    如果你觉得内容不够丰富,你把我Xaml文件中注释掉的代码加上,你会看到TreeViewItem中控件更多的TreeView。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已建议为答案 Jarrey 2011年1月21日 6:58
    • 已标记为答案 雕刻_时光 2011年1月21日 7:39
    2011年1月21日 6:02
    版主

全部回复

  • TreeNode? 你使用的winform的TreeView吗?WPF的TreeView没有TreeNode阿,一般来说都是通过邦定来实现节点的显示。而一个标准的TreeView动态增加,是通过邦定,然后在数据源中增加数据,让邦定系统去同步UI和数据源,并不需要程序员去关心具体的Node显示。

    例子:

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月20日 9:04
    版主
  • 您姑且把我当成程序员+UI开发人员。这是我的代码,您看看在这有什么办法动态的给一个TreeNode添加一个控件,例如TextBox?

     

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();

                System.Windows.Forms.TreeView TV = (System.Windows.Forms.TreeView)windowsFormsHost1.Child;

                TreeNode tnA = new TreeNode("A");
                TreeNode tnA1 = new TreeNode("A1");
                tnA.Nodes.Add(tnA1);

                TreeNode tnB = new TreeNode("B");
                TreeNode tnB1 = new TreeNode("B1");
                tnB.Nodes.Add(tnB1);

                TreeNode tn = new TreeNode("Root");
                tn.Nodes.Add(tnA);
                tn.Nodes.Add(tnB);

                TV.Nodes.Add(tn);
            }
        }

    2011年1月21日 1:21
  • 你好 雕刻_时光,

    我看了你的第一个问题,和你给Bob的回复, 我想我已经明白了你的需求。

    我现在很困惑的是:你为什么要在一个WPF的项目中添加一个Winform的控件,然后又打算像使用WPF一样去在WinForm的控件中添加另一个控件,这样本来就是一个很复杂的需求,你必须要对WinForm中的TreeNode进行重绘,这是一个很复杂的实现方式。

    你能告诉我,你必须以这种方式实现的原因么?

    针对你的需求,我想WPF中的TreeView实现起来是很简单的,在WPF中的Treeview的结点中添加一个TextBox是很容易的,你可以考虑用这种方式去完成你的项目。

    我根据你的需求给你写了一个直接运行的例子,你可以参考一下,下载地址是:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/For%20%e9%9b%95%e5%88%bb%5E_%e6%97%b6%e5%85%89/WPFTreeViewTutorial.rar

    你运行这个程序,然后在TextBox输入框中输入内容,点击AddItem,然后你就会加入一个TextBox控件。

    如果你觉得内容不够丰富,你把我Xaml文件中注释掉的代码加上,你会看到TreeViewItem中控件更多的TreeView。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已建议为答案 Jarrey 2011年1月21日 6:58
    • 已标记为答案 雕刻_时光 2011年1月21日 7:39
    2011年1月21日 6:02
    版主
  • Hi,Sheldon _Xiao

    非常感谢,我看了您的Demo,解决了我的问题,其实我不是非要在wpf下使用Winform的控件,只不过这个是别人的代码,我只是尝试在此基础上不做太大改动而已。

    我了解您的Demo的意思,但是我在自己写一个类似的程序时又有一个问题:请看如下代码:

     

                TreeViewItem tvi1 = new TreeViewItem();

                System.Windows.Controls.TextBox tbx = new System.Windows.Controls.TextBox();
                tbx.Name = "tt";


                StackPanel sp = new StackPanel();
                sp.Children.Add(tbx);

                tvi1.Header = sp;           
                tv1.Items.Add(tvi1);
              

                StackPanel sp1 = ((StackPanel)tbx.Parent);
                int d = sp1.Children.Count;
                object obj = sp1.FindName("tt");

     

    我在后台动态生成了一个TreeViewItem,并给它的header赋了一个stackpanel。这个stackpanel里包含一个textbox。但是我用stackpanel的FindName()方法返回了null。但是如果是一开始在xaml文件里存在的stackpanel,用这个方法就可以找到里面的元素。

    不明白,有什么办法能让后台生成的控件正常使用这个方法?

    2011年1月21日 7:48
  • 你好 雕刻_时光,

    我阅读了你的新问题,我觉得这个问题的关键是FindName()方法的使用问题,它和你这个帖子的最初问题“WPF TreeView控件的问题”是不相关的,我建议你重发一个帖子,提问你现在的问题。

    这样做的好处是:

    1) 有助于论坛的其他成员浏览你的新帖子,并且给出他们的建议。

    2) 有助于跟你这个帖子有一样问题的论坛其他成员通过你的这个帖子找到答案,并且解决他们的问题。

    3) 有助于跟你新帖子有一样问题的论坛其他成员通过新帖子找到答案,并且解决他们的问题。

    4) 有助于我们中文MSDN论坛健康的发展。

    同样,我会在你的新帖子中给出建议或者解决方案。

    感谢你的合作。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月21日 7:58
    版主