答案 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>