没有IValueConverter,如何处理重复?

时间:2019-03-04 12:40:38

标签: wpf

我用WPF编写了一个自定义控件,我想这样做:

1.按百分比设置填充

2.自动将顶部/左侧/右侧/底部(填充)全部设置为顶部/左侧/右侧/底部(填充)中的最小值。


这是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多次即可。我认为结果是相同的,因此重复的计算是没有用的。而且,如果项目中有很多此控件,则会降低性能。

恐怕我还没有清楚地解释并造成一些误解。但我想学习如何实现这一目标。谢谢。

1 个答案:

答案 0 :(得分:1)

在这种情况下,列或行中的star属性将使所有大小相等,这将导致2个小蜂蜂成为大小的一半。 您还可以使一行的大小是另一行的2倍,而给一行"*",第二行的行则以"2*"开始。

在您的情况下,请替换为该

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{TemplateBinding ActualHeight,Converter={StaticResource GridLengthConverter}}"></ColumnDefinition>
                            <ColumnDefinition Width="{TemplateBinding ActualHeight,Converter={StaticResource GridLengthConverter}}"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="{TemplateBinding ActualHeight,Converter={StaticResource GridLengthConverter}}"></RowDefinition>
                            <RowDefinition Height="{TemplateBinding ActualHeight,Converter={StaticResource GridLengthConverter}}"></RowDefinition>
                        </Grid.RowDefinitions>

具有:

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>

编辑:

                            <Grid.RowDefinitions>
                                <RowDefinition Height="4*"></RowDefinition>
                                <!-- i will take 80 % of the space available-->
                                <RowDefinition Height="*"></RowDefinition>
                                <!-- i will take 20 % of the space available-->
                            </Grid.RowDefinitions>