2011-02-10 109 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会更具可定制性,那么我认为这将是理想选择。你总是需要在网格和面板之间进行选择,并且通常如果你获得了某些东西你就会失去其他东西。