ChildWindow宽度/高度绑定不正确

本文关键字:绑定 不正确 高度 宽度 ChildWindow | 更新日期: 2023-09-27 18:30:05

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

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

我正在绑定它,这样当他们调整浏览器大小时,子窗口也应该如此。然而,我的儿童窗口不受大小限制。它仍然保持默认大小。我的装订不正确吗?

ChildWindow宽度/高度绑定不正确

我不相信你会让绑定工作起来。让您的ChildWindow充满屏幕的最简单方法就是设置HorizontalAlignment&垂直对齐以拉伸

<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路线,你必须做一些事情,比如。。。

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

我认为您正在尝试绑定到不存在的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);
ActualHeight和ActualWidth更改时,Content类不会引发PropertyChanged事件;因此Binding无法知道它需要刷新值。在仍然使用Binding的情况下,有一些复杂的方法可以解决这个问题,但最简单的答案就是处理Content.Resized事件并自己设置值。

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

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

根据那篇文章,你不能绑定到只读属性,而ActualWidth和ActualHeight就是只读属性。

我不知道这在Silverlight中是否有效,但它在WPF中对我们来说效果很好。

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

不要尝试将ActualWidth用作ElementName绑定。如果您有需要更新的场景基于ActualWidth,使用SizeChanged处理程序。

这里有一个使用附加属性的解决方案。还应该直接将此功能包装在XAML友好的Blend行为中(可能是Behavior<FrameworkElement>)。