2012-04-04 4 views
1

Ich versuche, mein untergeordnetes Fenster auf die Größe meiner Anwendung festzulegen, so dass es den gesamten Bildschirm einnimmt. Ich verwende den folgenden Code ein:ChildWindow width/height nicht korrekt binden

Binding widthBinding = new Binding("Width"); 
widthBinding.Source = App.Current.Host.Content.ActualWidth; 
this.SetBinding(ChildWindow.WidthProperty, widthBinding); 

Binding heightBinding = new Binding("Height"); 
heightBinding.Source = App.Current.Host.Content.ActualHeight; 
this.SetBinding(ChildWindow.HeightProperty, heightBinding); 

Wo this das Kind Fenster ist.

Ich bin es verbindlich, so dass, wenn sie die Größe ihres Browsers ändern, sollte das Kind Fenster ebenso. Mein untergeordnetes Fenster ist jedoch nicht an die Größen gebunden. Es bleibt immer noch seine Standardgröße. Ist meine Bindung falsch?

Antwort

3

Ich bin nicht zuversichtlich, dass Sie verbindlich werden zu arbeiten. Die einfachste Methode, um Ihren Childwindow füllen den Bildschirm wird nur die Horizontal & Vertical gesetzt

<controls:ChildWindow x:Class="SilverlightApplication4.ChildWindow1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" 
      Title="ChildWindow1" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 

Stretch Wenn Sie unbedingt die Actual/Actual Strecke in Silver gehen wollen, würden Sie so etwas wie zu tun haben .. .

2

Ich denke, Sie versuchen, an ActualWidth.Width zu binden, die nicht existiert. Entfernen Sie die "Width"/"Height" Zeichenfolgen von Ihrem Bindungskonstruktor, und es sollte funktionieren.

+1

Dies behebt seinen Fehler, aber da App.Current.Host.Content keine INotifyPropertyChange-Schnittstelle ist, wird sie nicht dynamisch aktualisiert. – MerickOWA

+0

@MerickOWA Das ist wahr, ich würde eine "RelativeSource" -Bindung verwenden, um den übergeordneten 'Window' zu finden und die Größe auf diese Weise zu binden. – Rachel

+0

Danke für den Vorschlag. Ich wusste nicht, dass es INotifyPropertyChange nicht implementiert hat. Ich ging mit der Lösung von MerickOWA, weil es am einfachsten war. – Justin

1

Die Content-Klasse löst kein PropertyChanged-Ereignis aus, wenn ActualHeight und ActualWidth geändert werden. Die Bindung kann also nicht wissen, dass sie die Werte aktualisieren muss. Es gibt einige komplizierte Methoden, mit denen Sie umgehen können, während Sie weiterhin Binding verwenden. Die einfachste Antwort besteht jedoch nur darin, das Ereignis Content.Resized zu verarbeiten und die Werte selbst festzulegen.

0

Wenn @ Rachels Antwort nicht funktioniert, könnte man die Technik in diesem Blog-Posting umrissenen wollen versuchen:

http://meleak.wordpress.com/2011/08/28/onewaytosource-binding-for-readonly-dependency-property/

Nach diesem Beitrag können Sie nicht nur lesbar Eigenschaften binden, die Actual und ActualHeight sind.

Ich weiß nicht, ob dies in Silverlight funktioniert, aber es hat gut für uns in WPF funktioniert.

+0

Er versucht nicht, an ActualWidth & ActualHeight zu binden, er versucht, FROM ActualWidth & ActualHeight zu binden – MerickOWA

0

ActualWidth und ActualHeight feuern keine PropertyChanged-Ereignisse in Silverlight. Dies ist per Entwurf (etwas über die Optimierung der Leistung der Layout-Engine, wenn ich mich erinnere). Daher solltest du niemals versuchen, an sie zu binden, weil es einfach nicht funktioniert. Die empfohlene Lösung besteht darin, das SizeChanged-Ereignis zu behandeln und dann die Dinge selbst entsprechend zu aktualisieren. Vom documentation:

Versuchen Sie nicht, Actual als Bindungsquelle für ein Element Bindung zu verwenden. Verwenden Sie einen SizeChanged-Handler, wenn Sie ein Szenario haben, das Updates benötigt, die auf ActualWidth basieren.

Here's a solution mit angehängten Eigenschaften. Es sollte auch ganz einfach sein, diese Funktionalität in ein XAML-freundliches Mischverhalten einzubetten (wahrscheinlich Behavior<FrameworkElement>).