Wpf 如何将宽度绑定到最宽的后续项(重复绑定任何子项的任何子项)?

Wpf 如何将宽度绑定到最宽的后续项(重复绑定任何子项的任何子项)?,wpf,xaml,canvas,data-binding,Wpf,Xaml,Canvas,Data Binding,我使用下面的语法 <Canvas Width="{Binding ActualWidth, ElementName=Beep}"> ... </Canvas> ... 目前,Beep是画布下最广泛的控件,但不能保证保持这种状态。我需要将宽度绑定到画布中最宽的继承者(即,重复地说,任何孩子的孩子) 如何才能做到这一点?尝试绑定到您感兴趣的所有控件的集合。然后编写一个转换器并从集合中选择最宽的控件 如果您没有控件集合,当然也可以使用多重绑定。我没有测试它,但您可以尝

我使用下面的语法

<Canvas Width="{Binding ActualWidth, ElementName=Beep}">
  ...
</Canvas>

...
目前,Beep是画布下最广泛的控件,但不能保证保持这种状态。我需要将宽度绑定到画布中最宽的继承者(即,重复地说,任何孩子的孩子)


如何才能做到这一点?

尝试绑定到您感兴趣的所有控件的集合。然后编写一个转换器并从集合中选择最宽的控件


如果您没有控件集合,当然也可以使用多重绑定。

我没有测试它,但您可以尝试类似的方法。 在xaml中:


听起来如果设置一个超过所有其他宽度的固定宽度更容易。。。还是我高估了需要多少代码?你想给我一些代码样本,还是更大的工作量?(在后一种情况下,我就用Q&D的方式来做,呵呵。)
<local:Converter x:Key="converter"/>
<Canvas Width="{Binding Path=Children, RelativeSource={RelativeSource Self}}" Converter="{StaticResource converter}"">

</Canvas>
public class Converter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        UIElementCollection children=value as UIElementCollection;
        double ret=0.0;
        recursiveSearch(children, ref ret);
        return ret;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    private void recursiveSearch(UIElementCollection children, ref double width)
    {
        if(children == null || children.Count==0) return;
        foreach(UIElement element in children)
        {
            FrameworkElement el=element as FrameworkElement;
            if(el == null) continue;
            if(el.ActualWidth>width) width=el.ActualWidth;
            Panel p=el as Panel;
            if(p!=null) recursiveSearch(p.Children, ref width);
        }
    }
}