无法绑定保证金属性?

时间:2011-02-03 22:24:11

标签: wpf layout binding converter margin

我正试图制作一种动画电影片,其中只有一个字段在给定时刻可见。就像相机中的胶片一样 - 目前只有一个胶片场被放置在镜头下面并准备好了。我尝试将其作为带有另一个网格的网格来实现。 “电影条”在下面的代码中称为pageContainer。在后面的代码中我做了一个动画,它改变了pageContainer网格的Margin属性。完美的工作,pageContainer很好地向左或向右滑动,如我所愿。例如:要显示页面号。 2边距设置为(-270,0,0,0)而不是(0,0,0,0)。这会将pageContainer移到左侧,只有第二个字段可见,而不是第一个字段。

然而,只要我开始调整整个UI的大小,此机制就会停止工作,用户可以看到两个页面(字段)之间的边框,而不仅仅是当前页面之间的边框。如果我将断点放到我的pageWidthConverter上,那么在调整整个UI的大小时总会遇到它。如果我将另一个断点放到pageMarginConverter上,那么在调整大小期间它永远不会被击中。为什么?我想使Margin属性依赖于BackgroundRectangle ActualWidth,就像我使用Width属性一样。但这不起作用。为什么在调整窗口大小时动态设置宽度,但边距不是???

PS:可以使用TranslateTransform而不是使用Margin。我试过但也没有成功。

如果有人能提供帮助,我们将非常感激。

干杯 汉斯

        ... <Grid Grid.Row="3" Grid.Column="1" Margin="0,-4,0,0" ClipToBounds="True">
                <Grid x:Name="pageContainer"
                      Width="{Binding Converter={StaticResource pageWidthConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}"
                      Margin="{Binding Converter={StaticResource pageMarginConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}" >

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                    </Grid.ColumnDefinitions> ...

1 个答案:

答案 0 :(得分:2)

听起来你需要你的余量依赖于两件事(1)你想要的偏移量和(2)你的ActualWidth的一些比例,以便你的UI可以很好地扩展。你尝试过使用MultiBinding吗?看看以下文章:

http://www.codeproject.com/KB/WPF/WpfWinFormsBulletGraphs.aspx#layout

这使用多重绑定根据控件的大小缩放某些值。这是多重绑定:

class ScalingMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, 
            object parameter, CultureInfo culture)
    {
        if (!ValuesPopulated(values))
            return 0.0;

        double containerWidth = (double)values[2];
        double valueToScale = (double)values[1];
        double maximum = (double)values[0] ;

        return valueToScale * containerWidth / maximum;
    }

    private bool ValuesPopulated(object[] values)
    {
        foreach (object value in values)
        {
            if (value==null || value.Equals(DependencyProperty.UnsetValue))
                return false;
        }
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, 
                object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

以及它的用法示例:

<Rectangle.Width>
    <MultiBinding Converter="{StaticResource ScalingMultiConverter}">
        <Binding Path="(c:BulletGraphWithLegend.GraphRange)"/>
        <Binding Path="(c:BulletGraphWithLegend.FeaturedMeasure)"/>
        <Binding Path="ActualWidth"/>
    </MultiBinding>
</Rectangle.Width>

您应该能够创建一个多重绑定,获取所需的偏移量和ActualWidth并将其转换为保证金。

另一方面,为什么不将Grid包装在Canvas中并通过Canvas.Left属性定位它?这样,您就不必在转换器中构建厚度。