2015-12-13 114 views
0

我正在开发一个Windows 10 UWP应用程序,并且想要添加带有按钮的文本框,如屏幕截图中所示。截图取自Windows 10上的通用地图应用程序。如果有人可以指向我的任何文档或样本,我会非常感激。将按钮添加到文本框

enter image description here

回答

2

这里有一个提示:看TextBox control template

它很长,所以我不会复制整个事情,但是如果你看看底部,你会注意到有一个ContentControl for placeholder文本(PlaceholderTextContentPresenter),还有一个名为DeleteButton的按钮,它是当您将注意力集中在带有一些文本的文本框时可见。

这表明你想做的一种方法是修改模板,在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" /> 

代码隐藏:

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

出于完整性:外部字典必须在某一点在应用程序的资源被合并到现有的资源,例如:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources>