添加按钮到文本框

时间:2015-12-13 15:15:41

标签: c# xaml uwp

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

enter image description here

2 个答案:

答案 0 :(得分:2)

这是一个提示:查看TextBox control template

这很长,所以我不会复制整个内容,但是如果你看一下底部,你会注意到有一个ContentControl用于占位符文本(PlaceholderTextContentPresenter),还有一个名为DeleteButton的按钮,它是可见的当你专注于一个内部有文字的TextBox时。

这向您展示了一种做你想做的事情的方法是修改模板,在DeleteButton旁边有另一个按钮或类似的东西(取决于你最终想要达到的目的)然后你可以隐藏它或根据当前的VisualState显示它,这也是您在模板中定义的内容。

制作模板也意味着您可以使其完全可重复使用,因此您也应该能够在将来的项目中使用它。

答案 1 :(得分: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>