不能绑定保证金属性? [英] Cannot bind Margin property?

查看:20
本文介绍了不能绑定保证金属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

然而,一旦我开始调整整个UI的大小,该机制就停止工作,用户可以看到两个页面(字段)之间的边界,而不仅仅是当前页面。如果我在pageWidthConverter中设置了断点,那么在调整整个用户界面的大小时总是会遇到断点。如果我给pageMarginConverter设置另一个断点,它在调整大小的过程中永远不会命中。为什么?我希望边距属性依赖于BackEarth RectangleActualWidth,就像我使用Width属性所做的那样。但这并不管用。为什么在调整窗口大小时动态设置宽度,而不是边距?

PS:可以使用TranslateTransform,而不是使用空白处。我试过了,但也没有成功。

如果有人能帮忙,我们将不胜感激。

干杯 汉斯

        ... <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)您希望的偏移量和(2)您的实际宽度的一定比例,以便您的UI能够很好地扩展。您尝试过使用多绑定吗?请看下面的文章:

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并将其转换为边距的多绑定。

另外,为什么不将网格包装在画布中,并通过Canvar.Left属性对其进行定位?这样,您就不必在转换器中构建厚度。

这篇关于不能绑定保证金属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆