2011-03-05 57 views
1

我正在研究一個功能,該功能允許用戶點擊空白區域(例如Canvas)並添加一段文本點擊它們。他們點擊後,他們可以立即編輯文本,改變前景,字體大小等。有點像在PowerPoint幻燈片中添加一段文字。自定義WPF編輯文本就地控制的方法

我想知道這種控制的最佳方法是什麼。我最初的想法是一個自定義控件(從Control繼承),它有兩個內部TemplateParts:一個TextBlock和一個TextBox。我將有兩種視覺狀態:查看和編輯。我將在名爲Text的自定義控件上有一個字符串依賴項屬性,這兩個模板部件綁定到它們自己的Text屬性上。當用戶點擊控件時,它將進入編輯模式,TextBlock被摺疊並且TextBox可見。當TextBox失去焦點時,控件進入查看模式並且TextBlock變得可見。當用戶在編輯模式下編輯文本時,Text屬性會更新,並且所有綁定都會反映新的Text值。

我對這種方法的關注是我將要包裝的可綁定屬性的數量。例如,控件具有Foreground,FontSize和FontFamily屬性。我希望將這些屬性帶入到我的兩個模板部件控件中,因爲它們應該反映用戶始終想要看到的內容 - 無論是在「查看」和「編輯」模式下。例如,在自定義控件上設置Foreground = Red意味着內部TextBox和TextBlock也應該具有紅色前景。因此,我必須要連接在OnApplyTemplate的綁定每個屬性兩個模板部件:

public override void OnApplyTemplate(){ 

    // ... stuff ... 

    var foregroundBinding = new Binding 
    { 
     Source = this, 
     Path = new PropertyPath("Foreground") 
    }; 

    myTextBox.SetBinding(TextBox.ForegroundProperty, foregroundBinding); 
    myTextBlock.SetBinding(TextBlock.ForegroundProperty, foregroundBinding); 

    // repeat for every other property, such as font size, 
    // font family, width, maxwidth, height, maxheight, 
    // horizontal alignment, yadda yadda yadda... 
} 

考慮到有可能的數十項屬性我想從我的自定義控制轉移到這些內部模板部件,這似乎是一個乏味的方法,很難保持 - 特別是如果我稍後改變模板部分的策略。

有沒有更好的方法,還是我在正確的軌道上?

回答

1

爲什麼你需要TextBlock和TextBox?從你所說的話來說,TextBox本身就足夠了。您將應用具有某些觸發器的樣式,這些觸發器會根據IsKeyboardFocused改變外觀。

+0

儘管我仍然需要連接所有綁定,但您的方法會將它們減少一半。但是,如果我只處理一個TextBox,我可能從TextBox繼承(而不是從Control繼承),然後我可以免費獲得所有TextBox綁定。謝謝! – kindohm 2011-03-07 04:12:21

+0

從TextBox繼承的@Mike實際上就是我的意思。想知道爲什麼我沒有真正寫下它...... – 2011-03-07 08:07:24

+0

@Mike,僅供將來參考:涉及你認爲你必須設定的所有綁定:其中許多綁定沒有太多意義。你不想設置自定義控件的寬度,並且內部綁定到寬度。你會根據外部設置的約束調整內部控件的大小 - 因此根本沒有綁定。對於任何佈局屬性都是如此。實際上只有少數你必須像字體的東西或[Horizo​​ntalContentAlignment](http://msdn.microsoft.com/en-us/library/system.windows.controls.control.horizo​​ntalcontentalignment.aspx) – 2011-03-07 08:16:30

1

在TextBox和TextBlock中定義並綁定到自定義DependencyObject或放置在UserControl代碼後面的依賴項屬性的情況下,在XAML中創建UserControl可能更容易。兩個控件都可以綁定到相同的屬性。將文本框可見性設置爲處於查看模式時摺疊,並在編輯模式下將其設置爲可見。最初進入編輯模式時,務必將鼠標光標對準文本框。如果需要,我可以提供更多細節,但目前我正在通過智能手機輸入此信息。

1

我解決了這個問題,通過在文本塊上按需打開一個彈出窗口。文本編輯彈出窗口顯示一個文本框,該文本框無需綁定即可複製所有文本塊外觀。在彈出關閉並且文本塊文本被更新時,在更改被放棄。