2015-12-13 113 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>