7

在我的工作地点,我们最近一直在将我们的代码库从 .Net 3.5 升级到 .Net 4 (C#)。遇到的大多数问题都已解决,但是我无法弄清楚这一问题。我们通过混合 xaml 和后面的代码(基于开发人员的偏好)来初始化控件和页面,但是一个页面在打开时会抛出NullReferenceException 。这是(许多控件之一)抛出的代码片段。

所有抛出异常的代码都在 DataTemplate中(我认为这可能是相关的)

<TextBox x:Name="Values" Grid.Column="1" Grid.Row="0" Margin="5,2,5,2"
  Text="{Binding ElementName=Descriptions, Path=SelectedValue, UpdateSourceTrigger=PropertyChanged,
  Mode=TwoWay,        
  Converter={StaticResource EmptyConverter}}"
  GotFocus="Column_GotFocus"
  MinWidth="100"
  CharacterCasing="Upper"
  Visibility="{Binding Path=IsValueVisible, Converter={StaticResource VisibilityConverter}}" 
/>

现在在这里,抛线是:

GotFocus="Column_GotFocus" 

Column_GotFocus 在代码隐藏文件中。更多事实:在迁移之前我们没有任何问题,异常不断抛出,并且有三个不同的事件导致了这个问题。

抛出的三个事件是:

GotFocus="Column_GotFocus"
SelectionChanged="Descriptions_SelectionChanged"
Click="Search_Click"

删除这些可以完全解决我们的问题,但显然会导致软件出现功能问题。有谁知道可能导致这些问题的原因是什么?

编辑:

抱歉,澄清一下:从不调用事件处理程序,添加的 xaml 事件处理程序(例如,GotFocus="Column_GotFocus")似乎是引发异常的地方。

例外是:

System.NullReferenceException occurred
  Message=Object reference not set to an instance of an object.
  Source= <assembly/namespace>
  StackTrace:
       at <assembly/namespace>.<Class>.System.Windows.Markup.IStyleConnector.Connect(Int32 connectionId, Object target) in <XamlFilePath>:line 291
  InnerException: 

编辑2:

方法处理程序是:

    private void Column_GotFocus(object sender, RoutedEventArgs e)
    {
        ContentPresenter columnContentPresenter =(DependencyObject)sender).FindParent<ContentPresenter>();

        Column column = (Column)columnContentPresenter.Content;

        string message = string.Format("{0} ({1})", column.Name, column.Field);

        ModuleDescriptor.UpdateStatusBar(message);
    }
4

2 回答 2

10

This is a framework bug and it is already fixed, please download the hot fix to overcome the issue!!

http://support.microsoft.com/kb/2464222

Bug report is here:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/629bfcc5-2005-4947-a001-993524798b52

Download the file here

于 2012-10-18T08:05:45.380 回答
6

我认为问题是您正在尝试在样式设置器中添加事件处理程序。这是禁止的(出于晦涩的原因)...您应该改用 EventSetters

例如:

<Style x:Key="YourSyleName" TargetType="{x:Type CtrlType}">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="dgClient_PreviewMouseLeftButtonDown"/>
    <EventSetter Event="Loaded" Handler="GridContent_Loaded"/>
</Style>
于 2012-07-10T11:48:36.270 回答