C# WPF TreeView 的节点如何重命名

淡忘cs 2014-05-12 05:41:37

本人对WPF不太熟悉 在WPF 中 如何重命名节点的名称
如果用重绘:如何获取节点坐标,又如何设置TextBox坐标?
或者有其他更好的方法?
求大神指点
...全文
376 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ptrtoptr 2014-05-14
  • 打赏
  • 举报
回复
为麻要用双绑定这么蛋疼的东西,如果用Textbox,你还要考虑,它什么时候是只读的,不可拥有可输入的焦点,什么时候又是可以有输入焦点的,这样不仅要修改模板做绑定,还要对付触法器,不如按简单的方法做,你看VIsual Studio它都是只弹出对话框。
Ptrtoptr 2014-05-14
  • 打赏
  • 举报
回复
我真不明白,你既然只是要重命名节点,为什么不弹出对话框这么简单,VS不就是这样做的吗,
exception92 2014-05-14
  • 打赏
  • 举报
回复
把 DataTemplate 绑定到你的Treeview上的ItemsPanelTemplate上。 这还不详细???
淡忘cs 2014-05-14
  • 打赏
  • 举报
回复
引用 7 楼 duanzi_peng 的回复:
[quote=引用 6 楼 u012854298 的回复:] [quote=引用 3 楼 duanzi_peng 的回复:] 修改treeview的模板,绑定到TextBox上。

 <HierarchicalDataTemplate x:Key="DataTemplate" ItemsSource="{Binding ChildrenEntityTree}">
            <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding ChildrenEntityTree}">
                    <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
把textBlock改成textBox,绑定方式改成双向绑定
看不太懂,这个方法好像可行,就是不知道怎么用到我的这上面
<TreeView x:Name="myFolders" Margin="0,20,0,0" Width="auto" TreeViewItem.PreviewMouseRightButtonDown="TreeViewItem_PreviewMouseRightButtonDown"    TreeViewItem.Selected="TreeViewItem_Selected"  TreeViewItem.Expanded="mytreeview_Expanded" HorizontalAlignment="Left" VerticalAlignment="Top" Height="auto">
                <TreeView.Effect>
                    <DropShadowEffect ShadowDepth="1" Opacity="0.345"/>
                </TreeView.Effect>               
                <TreeView.ContextMenu>
                    <ContextMenu x:Name="menu" Width="50">
                        <MenuItem Header="下载" x:Name="download" MenuItem.Click="downloadMenuItem_Click" >                         
                        </MenuItem>
                        <MenuItem Header="同步到服务器" x:Name="upload" MenuItem.Click="uploadMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="文件夹另存为..." x:Name="share" MenuItem.Click="shareMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="新建文件夹"  MenuItem.Click="Createfolder_click" >
                        </MenuItem>
                         <MenuItem Header="添加文件" MenuItem.Click="dg_addnewfile_Click" >
                         </MenuItem>
                         <MenuItem Header="重命名"  MenuItem.Click="rename_Click" >
                        </MenuItem>                       
                        <MenuItem Header="删除"  MenuItem.Click="Delete_Click" >
                        </MenuItem>
                    </ContextMenu>
                </TreeView.ContextMenu>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
                    </Style>
                </TreeView.ItemContainerStyle>
            </TreeView>   
private void TreeViewRootLoad()//加载根目录
        {            
            string loginTemp = "username=" + Global.UserName;
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderFootList");
            myFolders.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvi = new TreeViewItem();
                tvi.Tag = dt.Rows[i]["FolderId"].ToString();
                tvi.Header = dt.Rows[i]["FolderName"].ToString();
                tvi.Items.Add("*");
                if (i == dt.Rows.Count - 1)
                {
                    fid = tvi.Tag.ToString();
                    BandFile();
                }
                myFolders.Items.Add(tvi);
            }
        }
 private void tv_ChildLoad(TreeViewItem tvi)//展开子目录
        {
            string loginTemp = "Folderid=" + tvi.Tag.ToString();
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderChildList");
            if (!tvi.Items.Contains("*"))
            {
                return;
            }
            tvi.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvis = new TreeViewItem();
                tvis.Tag = dt.Rows[i]["FolderId"].ToString();
                tvis.Header = dt.Rows[i]["FolderName"].ToString();
                tvis.Items.Add("*");
                tvi.Items.Add(tvis);               
            }
        }
[/quote] 把 DataTemplate 绑定到你的Treeview上的ItemsPanelTemplate上。[/quote] 能说的详细一些吗,我接触WPF才两个星期..
小恒丶 2014-05-13
  • 打赏
  • 举报
回复
你的绑定的数据实现了ObservableCollection接口没 或者INotifyPropertyChanged没 如果没有的话那就不能修改了实时刷新的。
exception92 2014-05-13
  • 打赏
  • 举报
回复
修改treeview的模板,绑定到TextBox上。

 <HierarchicalDataTemplate x:Key="DataTemplate" ItemsSource="{Binding ChildrenEntityTree}">
            <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding ChildrenEntityTree}">
                    <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
把textBlock改成textBox,绑定方式改成双向绑定
淡忘cs 2014-05-13
  • 打赏
  • 举报
回复
引用 1 楼 Ptrtoptr 的回复:
考虑重绘的话有点麻烦吧,简单的办法是弹出个窗口,给他输名称,输完后,把他输的文本,做为TreeNode 的header,这样 处理比较简单
这个方法我知道,我想要能重命名的方法
exception92 2014-05-13
  • 打赏
  • 举报
回复
引用 6 楼 u012854298 的回复:
[quote=引用 3 楼 duanzi_peng 的回复:] 修改treeview的模板,绑定到TextBox上。

 <HierarchicalDataTemplate x:Key="DataTemplate" ItemsSource="{Binding ChildrenEntityTree}">
            <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding ChildrenEntityTree}">
                    <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
把textBlock改成textBox,绑定方式改成双向绑定
看不太懂,这个方法好像可行,就是不知道怎么用到我的这上面
<TreeView x:Name="myFolders" Margin="0,20,0,0" Width="auto" TreeViewItem.PreviewMouseRightButtonDown="TreeViewItem_PreviewMouseRightButtonDown"    TreeViewItem.Selected="TreeViewItem_Selected"  TreeViewItem.Expanded="mytreeview_Expanded" HorizontalAlignment="Left" VerticalAlignment="Top" Height="auto">
                <TreeView.Effect>
                    <DropShadowEffect ShadowDepth="1" Opacity="0.345"/>
                </TreeView.Effect>               
                <TreeView.ContextMenu>
                    <ContextMenu x:Name="menu" Width="50">
                        <MenuItem Header="下载" x:Name="download" MenuItem.Click="downloadMenuItem_Click" >                         
                        </MenuItem>
                        <MenuItem Header="同步到服务器" x:Name="upload" MenuItem.Click="uploadMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="文件夹另存为..." x:Name="share" MenuItem.Click="shareMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="新建文件夹"  MenuItem.Click="Createfolder_click" >
                        </MenuItem>
                         <MenuItem Header="添加文件" MenuItem.Click="dg_addnewfile_Click" >
                         </MenuItem>
                         <MenuItem Header="重命名"  MenuItem.Click="rename_Click" >
                        </MenuItem>                       
                        <MenuItem Header="删除"  MenuItem.Click="Delete_Click" >
                        </MenuItem>
                    </ContextMenu>
                </TreeView.ContextMenu>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
                    </Style>
                </TreeView.ItemContainerStyle>
            </TreeView>   
private void TreeViewRootLoad()//加载根目录
        {            
            string loginTemp = "username=" + Global.UserName;
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderFootList");
            myFolders.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvi = new TreeViewItem();
                tvi.Tag = dt.Rows[i]["FolderId"].ToString();
                tvi.Header = dt.Rows[i]["FolderName"].ToString();
                tvi.Items.Add("*");
                if (i == dt.Rows.Count - 1)
                {
                    fid = tvi.Tag.ToString();
                    BandFile();
                }
                myFolders.Items.Add(tvi);
            }
        }
 private void tv_ChildLoad(TreeViewItem tvi)//展开子目录
        {
            string loginTemp = "Folderid=" + tvi.Tag.ToString();
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderChildList");
            if (!tvi.Items.Contains("*"))
            {
                return;
            }
            tvi.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvis = new TreeViewItem();
                tvis.Tag = dt.Rows[i]["FolderId"].ToString();
                tvis.Header = dt.Rows[i]["FolderName"].ToString();
                tvis.Items.Add("*");
                tvi.Items.Add(tvis);               
            }
        }
[/quote] 把 DataTemplate 绑定到你的Treeview上的ItemsPanelTemplate上。
淡忘cs 2014-05-13
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
修改treeview的模板,绑定到TextBox上。

 <HierarchicalDataTemplate x:Key="DataTemplate" ItemsSource="{Binding ChildrenEntityTree}">
            <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding ChildrenEntityTree}">
                    <TextBlock Text="{Binding CurrentBaseEntity.Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
把textBlock改成textBox,绑定方式改成双向绑定
看不太懂,这个方法好像可行,就是不知道怎么用到我的这上面
<TreeView x:Name="myFolders" Margin="0,20,0,0" Width="auto" TreeViewItem.PreviewMouseRightButtonDown="TreeViewItem_PreviewMouseRightButtonDown"    TreeViewItem.Selected="TreeViewItem_Selected"  TreeViewItem.Expanded="mytreeview_Expanded" HorizontalAlignment="Left" VerticalAlignment="Top" Height="auto">
                <TreeView.Effect>
                    <DropShadowEffect ShadowDepth="1" Opacity="0.345"/>
                </TreeView.Effect>               
                <TreeView.ContextMenu>
                    <ContextMenu x:Name="menu" Width="50">
                        <MenuItem Header="下载" x:Name="download" MenuItem.Click="downloadMenuItem_Click" >                         
                        </MenuItem>
                        <MenuItem Header="同步到服务器" x:Name="upload" MenuItem.Click="uploadMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="文件夹另存为..." x:Name="share" MenuItem.Click="shareMenuItem_Click" >
                        </MenuItem>
                        <MenuItem Header="新建文件夹"  MenuItem.Click="Createfolder_click" >
                        </MenuItem>
                         <MenuItem Header="添加文件" MenuItem.Click="dg_addnewfile_Click" >
                         </MenuItem>
                         <MenuItem Header="重命名"  MenuItem.Click="rename_Click" >
                        </MenuItem>                       
                        <MenuItem Header="删除"  MenuItem.Click="Delete_Click" >
                        </MenuItem>
                    </ContextMenu>
                </TreeView.ContextMenu>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
                    </Style>
                </TreeView.ItemContainerStyle>
            </TreeView>   
private void TreeViewRootLoad()//加载根目录
        {            
            string loginTemp = "username=" + Global.UserName;
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderFootList");
            myFolders.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvi = new TreeViewItem();
                tvi.Tag = dt.Rows[i]["FolderId"].ToString();
                tvi.Header = dt.Rows[i]["FolderName"].ToString();
                tvi.Items.Add("*");
                if (i == dt.Rows.Count - 1)
                {
                    fid = tvi.Tag.ToString();
                    BandFile();
                }
                myFolders.Items.Add(tvi);
            }
        }
 private void tv_ChildLoad(TreeViewItem tvi)//展开子目录
        {
            string loginTemp = "Folderid=" + tvi.Tag.ToString();
            DataTable dt = HtmlHelper.GetSOAPResult(loginTemp, "GetFolderChildList");
            if (!tvi.Items.Contains("*"))
            {
                return;
            }
            tvi.Items.Clear();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeViewItem tvis = new TreeViewItem();
                tvis.Tag = dt.Rows[i]["FolderId"].ToString();
                tvis.Header = dt.Rows[i]["FolderName"].ToString();
                tvis.Items.Add("*");
                tvi.Items.Add(tvis);               
            }
        }
淡忘cs 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u011182647 的回复:
你的绑定的数据实现了ObservableCollection接口没 或者INotifyPropertyChanged没 如果没有的话那就不能修改了实时刷新的。
不是实时刷新的,这个treeview是每第一次打开的时候绑定的。 因为要修改这个目录 必须修改(数据库)和(文件所在位置的文件夹目录)
Ptrtoptr 2014-05-12
  • 打赏
  • 举报
回复
考虑重绘的话有点麻烦吧,简单的办法是弹出个窗口,给他输名称,输完后,把他输的文本,做为TreeNode 的header,这样 处理比较简单

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧