我想有2个控制具有相同的高度。 我可以只用XAML做呢?
如果我不喜欢的东西<Canvas Height="{Binding Height, ElementName=AnotherControl}" />
它实际上并没有做任何事情,高度变为零。 输出面板不抱怨任何约束力的错误,所以AnotherControl.Height确实存在。 我想结合的ActualHeight但它并不无论做任何事情。
什么我错过了吗?
我想有2个控制具有相同的高度。 我可以只用XAML做呢?
如果我不喜欢的东西<Canvas Height="{Binding Height, ElementName=AnotherControl}" />
它实际上并没有做任何事情,高度变为零。 输出面板不抱怨任何约束力的错误,所以AnotherControl.Height确实存在。 我想结合的ActualHeight但它并不无论做任何事情。
什么我错过了吗?
我的猜测是,你AnotherControl
没有明确给出一个Height
。 不幸的是,在WinRT中(不像WPF,但一样的Silverlight), ActualWidth
和ActualHeight
是所谓的“计算性能”。 这意味着一个属性更改事件不会在内部得到当他们改变募集。 其结果是,结合对他们来说是不可靠的,正如你已经注意到了,也不会完全奏效。
附注:可以从时间的工作时间,但是这是纯粹是因为时机的获取调用的绑定框架可通过ActualHeight
。
因此,作为它的立场,你不能只用XAML做。 你必须处理ActualControl.SizeChanged
代码隐藏事件和设置Height
来AnotherControl.ActualHeight
明确。
作为Kshitij梅塔提到的,结合的ActualHeight和ActualWidth的WinRT的中心不是可靠的。 但是,有一个很好的变通,在你没有使用SizeChanged将-事件:
加入这个类:
public class ActualSizePropertyProxy : FrameworkElement, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public FrameworkElement Element
{
get { return (FrameworkElement)GetValue(ElementProperty); }
set { SetValue(ElementProperty, value); }
}
public double ActualHeightValue
{
get { return Element == null ? 0 : Element.ActualHeight; }
}
public double ActualWidthValue
{
get { return Element == null ? 0 : Element.ActualWidth; }
}
public static readonly DependencyProperty ElementProperty =
DependencyProperty.Register("Element", typeof(FrameworkElement), typeof(ActualSizePropertyProxy),
new PropertyMetadata(null, OnElementPropertyChanged));
private static void OnElementPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActualSizePropertyProxy)d).OnElementChanged(e);
}
private void OnElementChanged(DependencyPropertyChangedEventArgs e)
{
FrameworkElement oldElement = (FrameworkElement)e.OldValue;
FrameworkElement newElement = (FrameworkElement)e.NewValue;
newElement.SizeChanged += new SizeChangedEventHandler(Element_SizeChanged);
if (oldElement != null)
{
oldElement.SizeChanged -= new SizeChangedEventHandler(Element_SizeChanged);
}
NotifyPropChange();
}
private void Element_SizeChanged(object sender, SizeChangedEventArgs e)
{
NotifyPropChange();
}
private void NotifyPropChange()
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("ActualWidthValue"));
PropertyChanged(this, new PropertyChangedEventArgs("ActualHeightValue"));
}
}
}
将其放置在资源:
<UserControl.Resources>
<c:ActualSizePropertyProxy Element="{Binding ElementName=YourElement}" x:Name="proxy" />
</UserControl.Resources>
并绑定到其属性:
<TextBlock x:Name="tb1" Text="{Binding ActualWidthValue, ElementName=proxy}" />
这个问题很老了,但这里是我的解决方案。 您可以使用此代码
<!--First Button-->
<Button x:Name="button1" Height="50" Width="100"/>
<!--Second Button-->
<Button x:Name="button2" Height="50" Width="{Binding ElementName=button1, Path=Width}"/>
我测试过它在我的Windows / Windows Phone的8.1设备,它workes很大。