【发布时间】:2019-08-22 03:33:41
【问题描述】:
我用 WPF 编写了一个自定义控件,我想这样做:
1.按百分比设置填充
2.自动将top/left/right/bottom(Padding)全部设置为top/left/right/bottom(Padding)的最小值。
这是Generic.xaml中的代码
<Style TargetType="{x:Type local:SC}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:SC}">
<Grid Margin="{TemplateBinding Margin}" Background="{TemplateBinding Background}" >
<Grid Margin="{TemplateBinding Padding}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Bind something"></ColumnDefinition>
<ColumnDefinition Width="Bind something"></ColumnDefinition>
<ColumnDefinition Width="Bind something"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Bind something"></RowDefinition>
<RowDefinition Height="Bind something"></RowDefinition>
<RowDefinition Height="Bind something"></RowDefinition>
</Grid.RowDefinitions>
<Grid Grid.Column="1" Grid.Row="1">
<ContentPresenter Content="{TemplateBinding Content}"></ContentPresenter>
</Grid>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我的想法是使用 3 行和 3 列,分别设置 GridLength 并将内容设置为 Grid.Column="1"&Grid.Row="1" 来做到这一点。
但是在我写了一些代码之后,我发现我必须使用一个multibinding&Converter , 多次计算 GridLength 来做。我认为结果是一样的,所以重复计算是没有用的。更重要的是,如果项目中有很多这个控件,它会降低性能。
恐怕我还没有解释清楚,造成一些误解。但我想学习如何实现这一目标。谢谢。
【问题讨论】:
-
您是否尝试过改用共享大小的列/行?
-
您是否担心浪费性能只是因为您不喜欢 CPU 多次执行相同的计算,即使它可能在几微秒内完成,或者您有吗?屏幕更新频率/帧率的视觉问题?
-
你怎么能有 3 行,每行都是他们父母身高的一半? 3*=0.5 = 可用空间的 150%....
-
不,有些不同,我希望列和行的长度与 ActualHeight/2 相同,但不只是共享大小。@H.B.
-
@MartinLiversage 首先,也许正如您所说,只需几微秒即可完成。但是我在项目中使用的这个自定义控件越多,花费的时间就越多。更重要的是,我认为我不应该这样编码。
标签: wpf