首页 > 解决方案 > 使用文本框 c# 填写列表视图

问题描述

我想填写一个我们使用文本框的树视图,但我有一个无法保存的问题

如何在树视图的文本框中显示文本字段输入。

附上允许我完成树视图的 XAML 代码和 C# 代码。

<Grid Grid.Column="0">
            <TabControl Margin="0,0,0,24" Name="SideTabControl" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">


                <TabItem Name="OutlineTabItem" HorizontalAlignment="Center" IsSelected="True">

                    <TreeView Name="bookmark_tree" RenderTransformOrigin="0.741,2.29" >
                        <TextBox x:Name ="txtBookmarkName" Margin="0,0,0,0" KeyDown="TxtBookmarkName_OnKeyDown" Visibility="Hidden" />

                    </TreeView>

                    <TabItem.Header>
                        <Image Source="../../Shared/Resources/IconImage/signet.png" Height="14" OpacityMask="#FFF0410E"
                       ToolTipService.ShowDuration="2000"/>
                    </TabItem.Header>

                    <ToolTipService.ToolTip>
                        <ToolTip Placement="Bottom">
                            <TextBlock Text="Liste des Signets"/>
                        </ToolTip>
                    </ToolTipService.ToolTip>

                </TabItem>

            </TabControl>

/// <summary>
    /// Méthode permettre l'ajoute d'un signet à une page d'un document.
    /// </summary>
    /// <param name="sender">Objet</param>
    /// <param name="e">Evenement</param>
    private void bookmark_Click(object sender, RoutedEventArgs e)
    {



         txtBookmarkName.Visibility = Visibility.Visible;
         txtBookmarkName.Focus();

    }

    /// <summary>
    /// Méthode permettre de Remplissez le contrôle d'arborescence de signets avec des éléments de signets.
    /// </summary>
    /// <param name="item">Signet à ajouter.</param>
    /// <param name="nodes">Liste des items.</param>
    static void BuildBookmarkTree(Bookmark item, ItemCollection nodes)
    {
        for (int i = 0; item.IsValid(); item = item.GetNext(), ++i)
        {
            TreeViewItem new_node = new TreeViewItem();
            new_node.Header = item.GetTitle();
            ToolTipService.SetToolTip(new_node, new_node.Header);
            nodes.Add(new_node);
            new_node.Tag = item;

            if (item.IsOpen()) new_node.IsExpanded = true;
            if (item.HasChildren()) // Ajouter récursivement des sous-arbres d'enfants
            {
                BuildBookmarkTree(item.GetFirstChild(), new_node.Items);
            }
        }
    }
 private void TxtBookmarkName_OnKeyDown(object sender, KeyEventArgs e)
    {


        if (e.Key == Key.Return)
        {
            // Récupère le document actuel
            //PDFDoc doc = PdfViewer.GetDoc();
            PDFDoc doc = this.PdfViewWpf.CurrentDocument;

            // Lock document
            PdfViewer.DocLock(true);




            // Permet de créér d'abord les éléments favoris du signet.
            string bookmarkName = txtBookmarkName.Text + ":" + PdfViewer.GetCurrentPage().ToString();
            Bookmark myBookmark = pdftron.PDF.Bookmark.Create(doc, bookmarkName);



            // Ajouter le signet à la racine.
            doc.AddRootBookmark(myBookmark);

            // Nous pouvons maintenant associer de nouveaux signets à des destinations de page:
            Destination bookmark_destination = Destination.CreateFit(doc.GetPage(PdfViewer.GetCurrentPage()));
            myBookmark.SetAction(pdftron.PDF.Action.CreateGoto(bookmark_destination));

            // Ajout pour actualiser l'arborescence de la visionneuse.
            BuildBookmarkTree(myBookmark, bookmark_tree.Items);


            // Unlock the document after we are done
            PdfViewer.DocUnlock();

            PdfViewHelper.Save(this.PdfViewer, doc);

            txtBookmarkName.Text = string.Empty;

        }
    }

图片显示了我使用文本框时的结果

关闭并再次打开应用程序后的结果

标签: c#wpfxaml

解决方案


好吧,有很多方法可以获取自定义字符串,这取决于您想要实现的目标以及它如何在您的 UI 中很好地工作。

从我看到的屏幕截图中,我认为您可以无缝地做到这一点的一种方法是TextBox在单击书签按钮时触发它在书签按钮下方可见。该框将具有键盘焦点,因此您可以轻松键入所需的书签标题,并在按“返回”时触发您已有的事件处理程序,只需替换:

string bookmarkName = "Mon signet sur la  page: " + 
        PdfViewer.GetCurrentPage().ToString();

txtBookmarkName.Text + ": " +
        PdfViewer.GetCurrentPage().ToString();
txtBookmarkName.Text = string.Empty();

下面的一些代码示例:

文本框的 XAML:

<TextBox x:Name"txtBookmarkName" Margin="0,0,0,0" KeyDown="TxtBookmarkName_OnKeyDown" Visibility="Hidden"/>

(边距值是占位符,您需要根据您的 UI 更改这些以定位和调整框的大小)

文本框的事件处理程序:

private void TxtBookmarkName_OnKeyDown(object sender, KeyEventArgs e)
{
    txtBookmarkName.Visible = false;    

    if (e.Key == Key.Return)
    {
        //Run bookmark_Click Event Handler Code
    }
}

(您可能希望为是否按下 Escape 以取消文本框以及如果文本框失去焦点添加一个事件)

您的书签按钮的代码,以便可以使 TextBox 可见并获得焦点:

private void Button_Click(object sender, RoutedEventArgs e)
{
    txtBookmarkName.Visibility = Visibility.Visible;
    txtBookmarkName.Focus();
}

推荐阅读