不能绑定保证金属性? [英] Cannot bind Margin property?
本文介绍了不能绑定保证金属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试一种动画胶片,其中在给定时刻只有一个场可见。就像照相机中的胶片一样--目前只有一个胶片场被放置在镜头下,准备被照亮。我试着用另一个网格来实现它。在下面的代码中,"胶片"称为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屋!
查看全文