首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IMultiValueConverter绑定Polygon.Points?

使用IMultiValueConverter绑定Polygon.Points?
EN

Stack Overflow用户
提问于 2013-03-14 05:25:13
回答 1查看 947关注 0票数 1

我已经成功地使用IValueConverter绑定了多边形的点。现在我需要使用IMultiValueConverter。

让我先概述一下我正在努力实现的目标,如果有人看到了更好的方法,请告诉我!我可以使用.NET 4.5仅供参考。

我有一个数据存储,里面有一堆对象。这些对象没有任何类型的Point/PointCollection与之关联。如果我具有父对象的高度,则可以基于数据存储中对象的特性创建点。如果没有高度,我就不能生成点。

我目前有一个工作的实现,但我在代码中执行所有的点计算。这会导致性能问题,因为每次父对象的高度发生变化时,我都必须重新计算所有对象。

关于代码:

代码语言:javascript
复制
<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>

和我的哑巴转换器代码:

代码语言:javascript
复制
    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(); }
}

顺便说一句,下面是我得到的错误:

代码语言:javascript
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 05:36:24

哈哈,我想我没有用尽我的调试。

我需要回传一个真正的PointCollection,而不是像使用常规IValueConverter那样回传一个字符串。

代码语言:javascript
复制
    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";
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15396774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档