ChildWindow宽度/高度无法正确绑定

时间:2012-04-04 16:14:39

标签: c# .net wpf silverlight

我正在尝试将我的子窗口设置为我的应用程序的大小,以便它占用整个屏幕。我使用以下代码:

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是子窗口。

我绑定它,以便当他们调整浏览器大小时,子窗口也应该如此。但是,我的子窗口没有绑定大小。它仍然是默认大小。我的装订不正确吗?

5 个答案:

答案 0 :(得分:3)

我不相信你会有工作的约束力。使ChildWindow填充屏幕的最简单方法是设置Horizo​​ntalAlignment& VerticalAlignment to 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">

如果你绝对想要在silverlight中使用ActualWidth / ActualHeight路线,你必须做类似......

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

答案 1 :(得分: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); 字符串,它应该可以正常工作。

{{1}}

答案 2 :(得分:1)

当ActualHeight和ActualWidth更改时,Content类不会引发PropertyChanged事件;所以Binding无法知道它需要刷新值。在使用Binding时,有一些复杂的方法可以解决这个问题,但最简单的答案就是处理Content.Resized事件并自己设置值。

答案 3 :(得分:0)

如果@ Rachel的答案不起作用,您可能想尝试本博客文章中概述的技术:

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

根据该帖子,您无法绑定到只读属性,即ActualWidth和ActualHeight。

我不知道这是否适用于Silverlight,但它在WPF中对我们有效。

答案 4 :(得分:0)

ActualWidth和ActualHeight不会在Silverlight中触发PropertyChanged事件。这是设计(如果我记得的话,关于优化布局引擎的性能)。因此,你永远不应该尝试绑定它们,因为它根本不起作用。建议的解决方案是处理SizeChanged事件,然后自己适当地更新事物。来自documentation

  

不要尝试使用ActualWidth作为绑定源   ElementName绑定。如果您的方案需要更新   基于ActualWidth,使用SizeChanged处理程序。

Here's a solution使用附加属性。它也应该直接将此功能包装在XAML友好混合行为中(可能是Behavior<FrameworkElement>)。