Wpf 如何知道UIElement是否具有固定宽度,或者是否应在测量/排列中拉伸

Wpf 如何知道UIElement是否具有固定宽度,或者是否应在测量/排列中拉伸,wpf,xaml,uielement,measure,Wpf,Xaml,Uielement,Measure,我制作了一个控件(看起来像一个网格),它可以包含多个子元素(UIElements)。我在代码中测量和安排整个布局。现在,其中一些元素在xaml中定义了宽度,而另一些元素没有 如何在measureOverride/arrangeoverride中知道某个元素的宽度是固定的,还是应该使用整个可用宽度 示例XAML: <MyControl> <TextBox x:Name="TextA" Text="TextFixed" Width="10"/> <TextB

我制作了一个控件(看起来像一个网格),它可以包含多个子元素(
UIElement
s)。我在代码中测量和安排整个布局。现在,其中一些元素在xaml中定义了宽度,而另一些元素没有

如何在measureOverride/arrangeoverride中知道某个元素的宽度是固定的,还是应该使用整个可用宽度

示例XAML:

<MyControl>
   <TextBox x:Name="TextA" Text="TextFixed" Width="10"/>
   <TextBox x:Name="TextB" Text="TextStretch"/>
</MyControl>

在uielement.Measure()后面的MeasureOverride方法中,大小是该元素所需的最小大小。我不知道如何知道何时应该计算“TextB”的可用宽度

更新:


在MeasureOverride()中,两个元素都具有水平对齐“拉伸”和后面的uiElement.Measure(availableSize)都具有所需的size.Width。这个宽度是它需要的最小宽度。有了这些信息,我无法知道这两个元素中的哪一个应该拉伸。

请查看控件的
水平对齐
垂直对齐
属性


如果它不是
拉伸
,则控件应仅采用固定大小。

查看控件的
水平对齐
垂直对齐
属性



如果不是
Stretch
,则控件应仅采用固定大小。

我的问题的解决方案是在
ArrangeOverride()
中检查宽度,此时元素应拉伸宽度为两倍。NaN

我的问题的解决方案是在
ArrangeOverride()中进行检查
在宽度上,当一个元素应该拉伸时,宽度是两倍。NaN

我发现,但在UIElement上,没有水平对齐或垂直对齐。当我将元素强制转换为文本框时,是这样的,但是UIElement可以是其他元素…抱歉。。。但是我发现,给定的XAML例子都是文本框的水平对齐拉伸…我想如果你指定了一个宽度,那么这就重写了拉伸设置,而且在设置拉伸时确保要考虑最小和最大宽度(并且没有设置明确的宽度),但是当我自己安排元素时,我必须知道这一点…我必须计算剩余宽度(在拉伸元素的情况下)或安排固定尺寸的宽度不确定你的意思。。。如果指定了宽度,则取该值。如果指定了最小值/最大值,则在最小值/最大值之间取所需值。对齐方式决定定位(顶部、左侧、底部等)。我发现,但在UIElement上没有水平对齐或垂直对齐。当我将元素强制转换为文本框时,是这样的,但是UIElement可以是其他元素…抱歉。。。但是我发现,给定的XAML例子都是文本框的水平对齐拉伸…我想如果你指定了一个宽度,那么这就重写了拉伸设置,而且在设置拉伸时确保要考虑最小和最大宽度(并且没有设置明确的宽度),但是当我自己安排元素时,我必须知道这一点…我必须计算剩余宽度(在拉伸元素的情况下)或安排固定尺寸的宽度不确定你的意思。。。如果指定了宽度,则取该值。如果指定了最小值/最大值,则在最小值/最大值之间取所需值。对齐方式决定了应拉伸哪个元素的位置(顶部、左侧、底部等),这取决于您的算法,因为您的控件充当布局容器,但我希望算法“读取”xaml。所以在这个例子中,TextA的宽度应该是10像素,TextB应该拉伸……正如我前面所说的,如果指定了宽度,元素就不会拉伸。所以从逻辑上讲,其他元素占据了剩余的大小。是的,当你把它放在网格或其他东西中时会发生这种情况。。。但是现在我必须自己在测量/排列方法中定义这两个元素的宽度…应该拉伸哪个元素取决于您的算法,因为您的控件充当布局容器,但我希望算法“读取”xaml。所以在这个例子中,TextA的宽度应该是10像素,TextB应该拉伸……正如我前面所说的,如果指定了宽度,元素就不会拉伸。所以从逻辑上讲,其他元素占据了剩余的大小。是的,当你把它放在网格或其他东西中时会发生这种情况。。。但是现在我必须自己在Measure/Arrange方法中定义这两个元素的宽度……但是您必须首先将其转换为
FrameworkElement
,对吗?我自己正在构建一个自定义的
面板
实现,但也有同样的问题(我不希望强制转换到FrameworkElement,因为我的一些子UIElement可能直接从UIElement派生)。很抱歉,我不再有该项目了。。。所以我不能帮你检查。但我认为这是对的。但是你必须先将它转换为
FrameworkElement
,对吗?我自己正在构建一个自定义的
面板
实现,但也有同样的问题(我不希望强制转换到FrameworkElement,因为我的一些子UIElement可能直接从UIElement派生)。很抱歉,我不再有该项目了。。。所以我不能帮你检查。但我认为这是对的。