заполнить список с помощью текстового поля c # - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел заполнить древовидную структуру, мы используем текстовое поле, но у меня есть проблема, которую я не могу сохранить

как отобразить текстовое поле, введенное в текстовое поле в древовидной структуре.

приложите код XAML и код C #, который позволяет мне завершить treeviws.

<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;

        }
    }

изображение показывает результат при использовании текстового поля

Результат после закрытия и повторного открытия приложения

1 Ответ

0 голосов
/ 18 февраля 2019

Ну, есть много способов получить пользовательскую строку, это зависит только от того, чего вы хотите достичь и как она работает в вашем пользовательском интерфейсе.

На скриншоте, который я видел, один способ, которым ядумаю, что вы могли бы сделать это без проблем, было бы вызвать TextBox, чтобы быть видимым под кнопкой закладки при нажатии на нее.Поле будет иметь фокус на клавиатуре, чтобы оно было видимым, так что вы можете легко ввести желаемое название закладки, и после нажатия «return» оно вызовет обработчик события, который у вас уже есть, просто замените:

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"/>

(Значения полей - это заполнители, вам понадобитсячтобы изменить их, чтобы расположить и изменить размер поля в соответствии с вашим пользовательским интерфейсом)

Обработчик событий для текстового поля:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...