2011-02-10 82 views
14

我開始讓自己的「WPF陷阱」的列表:事情來煩我,我得寫下記住,因爲我每次都愛上他們....什麼是WPF最糟糕的問題?

現在,我很確定你們都在某種程度上偶然發現了類似的情況,我希望你們分享一下你在這個問題上的經歷:

什麼讓你一直都在困惑中?你覺得最討厭的那個?

(我有一個似乎是不用解釋的幾個問題,也許你的意見將解釋他們)

這裏有一些我的「的personnal」陷阱(隨機贈送):

  1. 即使當點擊位於控件(例如標籤)的「透明」背景上而不僅僅是內容(本例中的文本)時,對於要觸發的MouseEvent,控件的背景必須設置爲「畫筆。透明「而不僅僅是」空白「(標籤的默認值)

  2. 一個WPF DataGridCell的DataContext的是RowView爲之小區屬於,而不是CellView

  3. 一個ScrollViewer中內部時,滾動條是由ScrollViewer中自身管理(即設置性能,如ScrollBar.Value是沒有效果)

  4. Key.F10不會觸發當您按下「F10」,而不是你Key.System,你必須去看看e.SystemKey得到Key.F10

...現在你在上。

+0

這不是一個真正的問題,因此不適合問答網站。您要求提供「X列表」,並且沒有人比其他所有人都更正確。 – ChrisF 2011-02-10 13:30:34

+3

@ChrisF:以問題的形式......「什麼是一些WPF陷阱?」然後將其標記爲社區wiki。我們有很多這類問題。 – 2011-02-10 13:41:50

+3

@emddudley - a)只有版主可以立即提出問題,並且b)它仍然是「x列表」問題,c)由於大多數(如果不是全部)這些問題都被問到,所以規則已經收緊。 – ChrisF 2011-02-10 13:51:13

回答

7

1)當我從WinForms進行轉換時,每隔半小時就會得到一個:在UI上放置隨機文本時使用TextBlock instead of Label(或者根本不使用任何標籤,如果文本是靜態的)!

2)DataTriggers /觸發器不能投入Control.Triggers,但必須進入Control.Styles /風格/ Style.Triggers

3)房產的類型必須實現IList,不IList<T>,如果財產將被XAML確認爲收集財產。

4)綁定捕獲異常。 5)使用單件轉換器/靜態轉換器類,所以你不必在每次使用它時創建一個新的轉換器。

6)一種類型的DependencyProperty的缺省值必須被明確規定:0u作爲UINT,(float) 0浮法,0.0如雙...

7)It matters if the control's property definitions are before or after its content

8)切勿使用PropertyMetadata來設置參考類型DependencyProperty的默認值。相同的對象引用將被分配給擁有類的所有實例。

13
  1. 總是看到輸出窗口爲 綁定錯誤。忽略輸出 窗口是眼淚的祕訣。

  2. 使用PresentationTraceOptions.TraceLevel在綁定調試綁定失敗時得到詳細的綁定信息=「高」。

  3. 讓靜態的,不變的資源,如刷PresentationOptions:凍結=「true」以在運行時節省資源。

  4. 使用WPF DataGrid中的數據網格。修改它像Excel一樣行爲是一個巨大的痛苦。

  5. BindingList<T>不CollectionViewSource發揮好。改爲從您的視圖模型公開ObservableCollection<T>

  6. 互聯網用品在WPF文本框顯示CueBanner文本半打不同的想法。他們都壞了。

1

我得到了一個非常漂亮的一個,上週跌跌撞撞:

當模板一個RichTextBox,事件處理中的模板如下與隧道或冒泡無關的奇怪路線

例如:對於應該隧道的事件:事件首先通過ContentPresenter進行隧道傳輸,然後從模板的頂部進行隧道傳輸。

看到my question on the subject

2

工具提示和ContextMenus沒有分享它的主人的DataContext的?我認爲,得到衆人先是

0

我個人最喜歡的是這一個:

public double MyVariable 
{ 
    get { return (double)GetValue(MyVariableProperty); } 
    set { SetValue(MyVariableProperty, value); } 
} 
public static readonly DependencyProperty MyVariableProperty = DependencyProperty.Register(
    "MyVariable", typeof(double), typeof(MyControl), new UIPropertyMetadata(0)); 

試試吧,一旦該場所被宣佈它將會崩潰。爲什麼?因爲顯然不能將0指定給使用反射的double。

不是一個真正的疑難雜症,但一個忠告:使用Snoop或類似的東西,如果你不使用它,你一定是瘋了......瘋了我告訴你!

1

有沒有乾淨的方法來處理驗證在WPF中,我不是魔術字符串的風扇,其IDataErrorInfo的提供默認:

public string this[string columnName] 
    { 
     if (columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result = "Please enter a First Name"; 
     } 
    } 

不過,我已經試過像SimpleMVVM,FluentValidation和MVVMValidation和很多框架迄今爲止MVVM驗證是最好的讓做的東西,如:

Validator.AddRule(() => RangeStart, 
      () => RangeEnd, 
      () => RuleResult.Assert(RangeEnd > RangeStart, "RangeEnd must be grater than RangeStart"); 
0

Binding.StringFormat只有當目標屬性的類型是string工作。

2
  • 如果啓用,Button.IsCancel分配falseWindow.DialogResultButton.IsDefault沒有。
    他們非常相似,對我而言,起初他們都應該關閉對話。我通常會打破MVVM和代碼隱藏

  • Button.IsCancel + Command =對話框無法關閉(左Window.DialogResult未分配)解決這一問題,但Command執行
    據我瞭解:如果IsCancelCommand有更高的優先級,然後在Esc它將爲DialogResult分配'false',並且不會調用Command。或者,如果Command具有更高的優先級,那麼將首先調用它,並且將分配DialogResult。我不明白它是如何跳過?

  • 綁定吞嚥異常!
    它不僅在調試時竊取時間,從OOP的角度來看也是錯誤的,因爲如果拋出異常,這意味着系統中某處發生了異常情況(從錯誤的數據提供到未授權的內存故障),所以它只有當你知道該怎麼做時才能被處理。你不能只是catch(Exception){}趕上他們,然後忽略。如果在程序應該通知用戶未知異常,登錄和關閉不假裝一切正常......

  • HeaderContent只能有一個孩子的控制,並沒有填充
    一切都應該有填充甚至邏輯控制(容器),對吧?我認爲這是不一致的。你怎麼看?

  • 如果設置通過FocusManager.FocusedElement聚焦到ListBox你仍然不能切換,因爲焦點被設置爲ListBox ES框架不是它的內容是內容與鍵盤。我想我不知道其他的UI API會將控件框架暴露給UI程序員,它應該從我們封裝,因爲抽象的ListBox代表一個列表,它只是列表中的東西而不是框中的事物列表。 確定它的名稱中有框,但仍然...我們在這裏幾乎有兩個不同的控件。 MVVM not breaking fix

  • ListBox.IsSynchronizedWithCurrentItem默認爲false因此,如果您分配不同的值或nullItesSource然後SelectedItem,直到用戶選擇從一個新的列表的東西仍持有舊值。例如,它可能會搞砸CanExecute。需要每次手動設置。

  • 沒有綁定公開在PasswordBox導致時間的浪費和髒黑客...但它仍然具有露出一個字符串屬性PasswordBox.Password甚至不設法爭論安全因爲史努比...

  • 這不是一個問題,但表格佈局是如此IE6 IMO。容器設計有助於將內容與其佈局分離。
    因爲每次我需要改變某些地方我需要搞砸Grid.RowGrid.Column。是的,我們有DockPanel,StackPanel等,但你不能在它們內部做一些列對齊。 (和DockPanel就像是完全分開的gotcha)如果UniformGrid會更具可定製性,那麼我認爲這將是理想選擇。你總是需要在網格和麪板之間進行選擇,並且通常如果你獲得了某些東西你就會失去其他東西。