我正试图制作一种动画电影片,其中只有一个字段在给定时刻可见。就像相机中的胶片一样 - 目前只有一个胶片场被放置在镜头下面并准备好了。我尝试将其作为带有另一个网格的网格来实现。 “电影条”在下面的代码中称为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> ...
答案 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属性定位它?这样,您就不必在转换器中构建厚度。