我已经成功地使用IValueConverter绑定了多边形的点。现在我需要使用IMultiValueConverter。
让我先概述一下我正在努力实现的目标,如果有人看到了更好的方法,请告诉我!我可以使用.NET 4.5仅供参考。
我有一个数据存储,里面有一堆对象。这些对象没有任何类型的Point/PointCollection与之关联。如果我具有父对象的高度,则可以基于数据存储中对象的特性创建点。如果没有高度,我就不能生成点。
我目前有一个工作的实现,但我在代码中执行所有的点计算。这会导致性能问题,因为每次父对象的高度发生变化时,我都必须重新计算所有对象。
关于代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Converters="clr-namespace:Converters"
x:Class="MainWindow"
Title="MainWindow" Height="611" Width="525">
<Window.Resources>
<Converters:PointsConverter x:Key="PointsConverter" />
</Window.Resources>
<Grid>
<Slider x:Name="slider" HorizontalAlignment="Left" Margin="344,10,0,0" VerticalAlignment="Top" Width="114" Value="1" Minimum="0.1" Maximum="4"/>
<ScrollViewer x:Name="TimelineScroller" ClipToBounds="True" VerticalScrollBarVisibility="Disabled"
Focusable="False" HorizontalScrollBarVisibility="Visible"
Visibility="Visible" Margin="50,93,35,206">
<Grid ClipToBounds="True">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<ItemsControl x:Name="TopItemControl" Grid.Row="1" ItemsSource="{Binding TopData}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="TopAxis" Background="#FF65656C" Grid.Row="1" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="{Binding Value, ElementName=slider}"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl >
<Polygon x:Name="polygon" Stroke="Black" RenderTransformOrigin="0.5,0.5">
<Polygon.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="{Binding Value, ElementName=slider}"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Polygon.RenderTransform>
<Polygon.Points>
<MultiBinding Converter="{StaticResource PointsConverter}">
<Binding ElementName="TopAxis" Path="ActualHeight"/>
<Binding />
</MultiBinding>
</Polygon.Points>
</Polygon>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</ScrollViewer>
</Grid>
和我的哑巴转换器代码:
public class PointsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
//simple string for testing
return "10,255 500,255 500,200 400,150 200,150 10,200";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); }
}顺便说一句,下面是我得到的错误:
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='10,255 500,255 500,200 400,150 200,150 10,200' MultiBindingExpression:target element is 'Polygon' (Name='polygon'); target property is 'Points' (type 'PointCollection')发布于 2013-03-14 05:36:24
哈哈,我想我没有用尽我的调试。
我需要回传一个真正的PointCollection,而不是像使用常规IValueConverter那样回传一个字符串。
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var pc = new PointCollection();
pc.Add(new Point(10, 255));
pc.Add(new Point(500, 255));
pc.Add(new Point(500, 200));
pc.Add(new Point(400, 150));
pc.Add(new Point(200, 150));
pc.Add(new Point(10, 200));
return pc;//"10,255 500,255 500,200 400,150 200,150 10,200";
}https://stackoverflow.com/questions/15396774
复制相似问题