1

画面全体を占めるように、子ウィンドウをアプリケーションのサイズに設定しようとしています。私は次のコードを使用しています:

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);

this子ウィンドウはどこにありますか。

ブラウザのサイズを変更するときに子ウィンドウも同様に変更されるようにバインドしています。ただし、子ウィンドウがサイズにバインドされていません。それはまだデフォルトのサイズのままです。私のバインディングは間違っていますか?

4

5 に答える 5

3

私はあなたが拘束力を働かせようとしているとは確信していません。ChildWindowを画面全体に表示する最も簡単な方法は、Horizo​​ntalAlignmentとVerticalAlignmentをStretchに設定することです。

<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">

どうしてもActualWidth/ActualHeightルートをSilverlightで実行したい場合は、次のようなことを行う必要があります...

public ChildWindow1()
{
  InitializeComponent();

  UpdateSize( null, EventArgs.Empty );

  App.Current.Host.Content.Resized += UpdateSize;
}

protected override void OnClosed( EventArgs e )
{
  App.Current.Host.Content.Resized -= UpdateSize;
}

private void UpdateSize( object sender, EventArgs e )
{
  this.Width = App.Current.Host.Content.ActualWidth;
  this.Height = App.Current.Host.Content.ActualHeight;
  this.UpdateLayout();
}
于 2012-04-04T16:28:20.057 に答える
2

ActualWidth.Width存在しないにバインドしようとしていると思います。バインディングコンストラクターから"Width"/文字列を削除すると、機能するはずです。"Height"

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

Binding heightBinding = new Binding();
heightBinding.Source = App.Current.Host.Content.ActualHeight;
this.SetBinding(ChildWindow.HeightProperty, heightBinding);
于 2012-04-04T16:18:48.473 に答える
1

Contentクラスは、ActualHeightとActualWidthが変更されたときにPropertyChangedイベントを発生させません。したがって、バインディングには、値を更新する必要があることを知る方法がありません。Bindingを使用しながらこれを回避するための複雑な方法がいくつかありますが、最も簡単な答えは、Content.Resizedイベントを処理し、値を自分で設定することです。

于 2012-04-04T16:20:41.700 に答える
0

@Rachelの回答が機能しない場合は、このブログ投稿で概説されている手法を試してみてください。

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

その投稿によると、ActualWidthとActualHeightである読み取り専用プロパティにバインドすることはできません。

これがSilverlightで機能するかどうかはわかりませんが、WPFではうまく機能しています。

于 2012-04-04T16:23:51.183 に答える
0

ActualWidthとActualHeightは、SilverlightでPropertyChangedイベントを発生させません。これは仕様によるものです(思い出すと、レイアウトエンジンのパフォーマンスを最適化するためのものです)。したがって、単に機能しないため、それらにバインドしようとしないでください。推奨される解決策は、SizeChangedイベントを処理してから、自分で適切に更新することです。ドキュメントから:

ElementNameバインディングのバインディングソースとしてActualWidthを使用しないでください。ActualWidthに基づく更新が必要なシナリオがある場合は、SizeChangedハンドラーを使用してください。

アタッチされたプロパティを使用するソリューションは次のとおりです。また、この機能をXAMLフレンドリーなBlend動作でラップすることも簡単です(おそらくBehavior<FrameworkElement>)。

于 2012-04-04T16:51:39.723 に答える