2010-11-17 1 views
9

У меня есть страница wpf, размещенная в окне. Но я получаю исключение Null, когда я пытаюсь использовать это. Он работает, тогда я использую этот код другим способом, но не в методах alla, почему так оно происходит? пожалуйста совет.C# WPF Cant get Parent Window

NewPage page = new NewPage(); 
Window w = Window.GetWindow(this.Parent); 
w.Content = page; 

Edit:

Heres полный код:

public HandOverListPage() { 
     InitializeComponent(); 

     _settings = new Settings(); 
    } 


    public void ShowCurrentInUseAssignment() { 

     _currentDoc = (App.Current as App).SelectedHandOverDoc; 

     var r = from item in (App.Current as App).SelectedHandOverDoc.Items 
       where item.Status != 20 
       select item; 

     if(r.Count() == 0) { 
      //Report assignment to QP with status finished 
      ReportAssignment(); 

      HandOverPage page = new HandOverPage(); 

      Window w = Window.GetWindow(this.Parent); 
      w.Content = page; 

      return; 
     } else { 
      ICollectionView view = CollectionViewSource.GetDefaultView((App.Current as App).SelectedHandOverDoc.Items); 
      view.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending)); 

      ListBoxAssignmentItems.ItemsSource = view; 
     } 

     TxtBlockCounter.Text = r.Count().ToString(); 
    } 

Ошибка:

{ "Значение не может быть пустым \ г \ nParameter имя:. DependencyObject"}

Я получаю это при непосредственном использовании окна

?this.GetType() 
{Name = "HandOverListPage" FullName = "QP_Truck.Pages.HandOverListPage"} 
    [System.RuntimeType]: {Name = "HandOverListPage" FullName = "QP_Truck.Pages.HandOverListPage"} 
    base {System.Reflection.MemberInfo}: {Name = "HandOverListPage" FullName = "QP_Truck.Pages.HandOverListPage"} 
    Assembly: {QP Truck, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} 
    AssemblyQualifiedName: "QP_Truck.Pages.HandOverListPage, QP Truck, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
    Attributes: Public | BeforeFieldInit 
    BaseType: {Name = "Page" FullName = "System.Windows.Controls.Page"} 
    ContainsGenericParameters: false 
    DeclaringMethod: 'this.GetType().DeclaringMethod' threw an exception of type 'System.InvalidOperationException' 
    DeclaringType: null 
    FullName: "QP_Truck.Pages.HandOverListPage" 
    GenericParameterAttributes: 'this.GetType().GenericParameterAttributes' threw an exception of type 'System.InvalidOperationException' 
    GenericParameterPosition: 'this.GetType().GenericParameterPosition' threw an exception of type 'System.InvalidOperationException' 
    GUID: {93eb30b9-a64e-3c6b-9182-0f93582d188d} 
    HasElementType: false 
    IsAbstract: false 
    IsAnsiClass: true 
    IsArray: false 
    IsAutoClass: false 
    IsAutoLayout: true 
    IsByRef: false 
    IsClass: true 
    IsCOMObject: false 
    IsContextful: false 
    IsEnum: false 
    IsExplicitLayout: false 
    IsGenericParameter: false 
    IsGenericType: false 
    IsGenericTypeDefinition: false 
    IsImport: false 
    IsInterface: false 
    IsLayoutSequential: false 
    IsMarshalByRef: false 
    IsNested: false 
    IsNestedAssembly: false 
    IsNestedFamANDAssem: false 
    IsNestedFamily: false 
    IsNestedFamORAssem: false 
    IsNestedPrivate: false 
    IsNestedPublic: false 
    IsNotPublic: false 
    IsPointer: false 
    IsPrimitive: false 
    IsPublic: true 
    IsSealed: false 
    IsSerializable: false 
    IsSpecialName: false 
    IsUnicodeClass: false 
    IsValueType: false 
    IsVisible: true 
    MemberType: TypeInfo 
    Module: {QP Truck.exe} 
    Namespace: "QP_Truck.Pages" 
    ReflectedType: null 
    StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute} 
    TypeHandle: {System.RuntimeTypeHandle} 
    TypeInitializer: null 
    UnderlyingSystemType: {Name = "HandOverListPage" FullName = "QP_Truck.Pages.HandOverListPage"} 

ответ

5

try Владелец Недвижимость Необходимо назначить его.

Пример:

public Activity ShowLookUp(Window owner) 
    { 

     ActivityLookUp lookup = new ActivityLookUp(); 
     lookup.Owner = owner; 
     lookup.ShowDialog(); 
    } 
+1

Я не уверен, что понимаю это. Почему это лучшее решение, чем «Window.GetWindow»? Можете ли вы дать еще несколько объяснений? –

+0

Я не говорю, что это лучшее решение. Это именно то, как я решаю проблему. –

+0

Я согласен - страница не имеет владельца по волшебству, вам нужно будет установить ее владельца явно. –

0

В каком контексте вы находитесь, когда вы звоните: this.Parent? Ожидаете ли вы this ссылку на объект page? Из примера кода, который вы добавили, это не так. Я предлагаю вам поставить точку останова на линии Window.GetWindow и сделать ?this.GetType() в ближайшем окне, чтобы узнать, что происходит.

11

Является ли код, который вы отправили в своем методе конструктора?

Родитель UserControl всегда имеет значение null в своем конструкторе, поэтому this.Parent возвращает нулевую ссылку. Таким образом, вызов Window.GetWindow(this.Parent) вызывает ArgumentNullException, потому что указанный вами объект зависимостей еще не создан.

Чтобы исправить это, вам необходимо поместить код в обработчик события Initialized. Когда это событие будет поднято, вы можете быть уверены, что был создан UserControl.

+0

Я добавил вывод из непосредственного окна в свой пост. – Tan

+0

Это работает для меня. И, вероятно, должен быть принят ответ. – gunwin

+0

Для меня работает Loaded event handler – netmajor

0

Tag может быть полезно иногда.

Почему бы не попробовать это.

// "this" is your Window 
YourFrame.Content = new YourPage() { Tag = this }; 

и в вашей страницы, попробуйте это

Window w = (Window)this.Tag; 
// and do all the Window wonders 

:)

0

Хотя есть приемлемые ответы перечислены, все они, как представляется, способ более усложняя дело.

У страницы нет родительского элемента, но поскольку страница - это только страница, а не окно, вызывающее окно get, оно возвращает ссылку на окно, а не страницу, поэтому все, что вам нужно;

Window w = Window.GetWindow(this); 

Просто опустите.Родитель