gpt4 book ai didi

silverlight - 绑定(bind)到 ActualWidth 不起作用

转载 作者:行者123 更新时间:2023-12-03 10:46:29 25 4
gpt4 key购买 nike

在 Silverlight 3.0 应用程序中,我试图在 Canvas 中创建一个矩形并让它拉伸(stretch) Canvas 的整个宽度。我试图通过绑定(bind)到 ActualWidth 来做到这一点。父容器的属性(如下面的示例),但是虽然我没有看到任何绑定(bind)错误,但该值没有被绑定(bind)。该矩形不可见,因为它的宽度为零。另外尝试绑定(bind)到 ActualWidth包含我的矩形的 Canvas ,但这没有区别。

我做了find this bug logged on Microsoft Connect但没有列出解决方法。

有没有人能够解决这个问题或者他们可以指出解决方案?

编辑:原始代码示例与我想要实现的目标不准确,为了更清晰而进行了更新。

<UserControl>
<Border BorderBrush="White"
BorderThickness="1"
CornerRadius="4"
HorizontalAlignment="Center">
<Grid x:Name="GridContainer">
<Rectangle Fill="Aqua"
Width="150"
Height="400" />
<Canvas>
<Rectangle Width="{Binding Path=ActualWidth, ElementName=GridContainer}"
Height="30"
Fill="Red" />
</Canvas>

<StackPanel>
<!-- other elements here -->
</StackPanel>
</Grid>
</Border>
</UserControl>

最佳答案

你想做什么需要你数据绑定(bind)到 ActualWidth属性(property)?
这是 Silverlight 的一个已知问题,没有简单的解决方法。

可以做的一件事是以这样一种方式设置可视化树,即您不需要实际设置 Rectangle 的宽度,只允许它拉伸(stretch)到适当的大小。因此,在上面的示例中,如果您移除 Canvas(或将 Canvas 更改为其他面板)并保留 RectangleHorizontalAlignment设置为 Stretch ,它将占用所有可用宽度(实际上是 Grid 的宽度)。

但是,在您的特定情况下这可能是不可能的,并且可能确实需要设置数据绑定(bind)。已经确定这是不可能的,但是在代理对象的帮助下,我们可以设置所需的绑定(bind)。考虑这段代码:

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

我们可以在 xaml 中使用它,如下所示:
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<c:ActualSizePropertyProxy Element="{Binding ElementName=LayoutRoot}" x:Name="proxy" />
</Grid.Resources>
<TextBlock x:Name="tb1" Text="{Binding ActualWidthValue, ElementName=proxy}" />
</Grid>

所以我们将 TextBlock.Text 绑定(bind)到代理对象上的 ActualWidthValue。代理对象依次提供 Element 的 ActualWidth,该值由另一个 Binding 提供。

这不是问题的简单解决方案,但对于如何将数据绑定(bind)到 ActualWidth,这是我能想到的最好的解决方案。

如果您对您的场景进行了更多解释,则可能会提出一个更简单的解决方案。可能根本不需要 DataBinding;是否可以只从 SizeChanged 事件处理程序中的代码设置属性?

关于silverlight - 绑定(bind)到 ActualWidth 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1602148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com