该实际场景比较常见于,当存在多个用户控件页面拼成一个窗体,因为实际控件对应窗体的宽度并不能确定,也不是那种能指定的宽度或者高度,比如窗体分导航地区和内容地区,左侧导航地区可以直接指定宽度,而右侧内容地区则是使用Auto或者*的宽度。在WPF中,尝试将一个控件的宽度绑定到其父级用户控件的实际宽度(ActualWidth)时,会遇到一些挑战。因为 ActualWidth和ActualHeight 是只读属性,并且它们是在布局过程之后计算出来的,这大概导致绑定延迟或不更新的问题。为了确保子控件能够准确地响应父控件大小的变革,根据实际环境使用如下方式。 方法1:使用相对宽度和星号单元最简朴的方法是让子控件自动填充可用空间,而不是显式地绑定到父控件的 ActualWidth。可以通过设置子控件的 HorizontalAlignment 属性为 Stretch 或使用在布局Grid的宽度用 * 星号单元来实现这一点。如下:- <rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>
复制代码 Card内容里部分,可用StackPanel容器包装,StackPanel容器自动顺应内部空间的宽度和高度,在联合HorizontalAlignment="Stretch"就可以实现,将rubyer:Card这个控件自动适配宽度和用户控件的宽度一样,固然也必要该rubyer:Card占据用户控件全部的Column。或:- <rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>
复制代码 方法2:使用 RelativeSource 绑定如果确实必要基于父控件的实际宽度进行绑定,可以尝试使用 RelativeSource 绑定来引用父控件的 ActualWidth。如下:- <rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>
复制代码 主要为:Width="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ActualWidth, Mode=OneWay}"
方法3:使用 SizeChanged 事件处置处罚程序另一种方法是在父控件的 SizeChanged 事件中手动调整子控件的宽度。这种方法适用于更复杂的环境,但通常不是首选,因为 WPF 布局系统应该能够处置处罚大多数场景。- private void PlanMoudelView_SizeChanged(object sender, SizeChangedEventArgs e){<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>if (cardNotice != null)<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>{<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>cardNotice.Width = this.ActualWidth; // 'this' 指向 PlanMoudelView<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>}}
复制代码 方法4:使用 MultiBinding 和转换器如果必要更复杂的逻辑,比如保存一定的边距或比例,可以使用 MultiBinding 联合 IMultiValueConverter 来计算子控件的宽度。- <rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>
复制代码 注意:确保父容器答应子控件扩展确保包含 Card 控件的父容器(例如 Grid)没有限定子控件的尺寸。检查是否有固定的高度或宽度、MaxWidth 或 MaxHeight 等大概影响布局的属性。 总结通常环境下,使用相对宽度(如 * 星号单元)和适当的 HorizontalAlignment 是最简朴有效的方法,可以确保子控件随着父控件的大小变革而自动调整。如果必要更准确的控制,可以考虑使用 RelativeSource 绑定或其他高级技术。确保父容器也支持子控件的动态尺寸调整非常紧张。 最后附上,绑定后宽度减数的转换器,因为通常不能直接用子控件跟父控件完全等宽或等高,肯定必要有偏差:  - /// /// 控件宽度减法转换器/// 可用于子控件绑定父控件宽度做减法/// public class SubtractValueConverter : IValueConverter{<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>{<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>double parentWidth = (double)value;<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>double subtractValue = double.Parse(parameter.ToString());<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>return parentWidth - subtractValue;<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>}<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>{<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card><rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>throw new NotImplementedException();<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>}}在用户控件页面增加绑定资源:<rubyer:Card x:Name="cardNotice" Grid.Row="1"
- Height="120"
- Padding="5"
- HorizontalAlignment="Stretch"
- HorizontalContentAlignment="Center">
-
- </rubyer:Card>然后,在绑定时增加转换器的使用:Width="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ActualWidth, Mode=OneWay, Converter={StaticResource subtractValueConverter}, ConverterParameter=20}"
复制代码 转换器代码实际下图中右下角的列表Card使用实例:  用户控件代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |