2015-12-13 3 views
0

Я разрабатываю приложение для Windows 10 UWP, и я хотел бы добавить текстовые поля с кнопками, как показано на скриншоте. Снимок экрана взят из универсального приложения «Карты» в Windows 10. Если кто-то может указать мне на любую документацию или образцы, я был бы очень благодарен.Добавить кнопку в текстовое поле

enter image description here

ответ

2

Вот подсказка: смотрите на TextBox control template.

Это очень долго, поэтому я не буду копировать все это, но если вы посмотрите на нижнюю часть, вы заметите, что есть текст ContentControl для заполнителя (PlaceholderTextContentPresenter), а также кнопка с именем DeleteButton, которая видимый, когда вы фокусируетесь на TextBox с некоторым текстом внутри.

Это показывает вам, что одним из способов сделать то, что вы хотите, является изменение шаблона, чтобы иметь другую кнопку рядом с DeleteButton или что-то подобное (в зависимости от того, чего вы пытаетесь достичь в конце), а затем вы можете скрыть его или показать в зависимости от текущего VisualState, что также будет определено в вашем шаблоне.

Создание шаблона также означает, что вы можете сделать его вполне многоразовым, чтобы вы могли использовать его и в будущих проектах.

+0

У меня есть вопрос об этом решении , Как вы обрабатываете события добавленной кнопки? Элемент управления TextBox, как и ожидалось, не представляет таких событий. Должен ли я подклассифицировать TextBox или есть другой способ, которым это можно сделать, просто переустановив элемент управления? – Corcus

0

Это ответ на следующий вопрос: как вы обрабатываете события на дополнительной кнопке?

Если ваш новый шаблон кнопки находится в каком-либо локальном ресурсном словаре (например, Page.Resources, вы можете просто добавить обработчик кликов непосредственно. Если шаблон кнопки живет в отдельном ресурсном словаре (Styles.xaml или что-то еще) делать это потребует создания кода позади для словаря это, вероятно, лучше подклассы и сделать что-то вроде этого:.

public class MyTextBox : TextBox 
{ 
    public event EventHandler<RoutedEventArgs> ExtraClick; 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     Button extraButton = GetTemplateChild("ExtraButton") as Button; 
     if (extraButton != null) 
     { 
      extraButton.Click += (sender, e) => ExtraClick?.Invoke(sender, e); 
     } 
    } 
} 

вы могли бы справиться с этим (или любой другой вы заботитесь решать) события, где вы на самом деле использовать кнопка, например,

<local:MyTextBox ExtraClick="OnExtraClicked" /> 

Code-за:

private void OnExtraClicked(object sender, RoutedEventArgs e) 
{ 
    // ... 
} 

Для полноты: Внешний словарь должен быть объединены в имеющиеся ресурсы в какой-то момент, например, в ресурсах приложения:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
Смежные вопросы