如何使用xmldataprovider构建曲线

时间:2014-07-21 08:01:47

标签: c# wpf xaml

我有一个代码:

<Page x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Page.Resources>
    <XmlDataProvider x:Key="TestData" XPath="/Base">
        <x:XData>
            <Base>
                <Stage>
                    <Curve xstep="2">
                        <Point Value="10"/>
                        <Point Value="50"/>
                        <Point Value="20"/>
                        <Point Value="50"/>
                        <Point Value="30"/>
                    </Curve>
                </Stage>
            </Base>
        </x:XData>
    </XmlDataProvider>

    <DataTemplate x:Key="TestDataTemplate">
        <Grid>
            <Grid.LayoutTransform>
                <ScaleTransform ScaleX="1" ScaleY="-1" CenterX=".5" CenterY=".5" />
            </Grid.LayoutTransform>
            <Image>
                <Image.Source>
                    <DrawingImage>
                        <DrawingImage.Drawing>
                            <GeometryDrawing>
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Red" Thickness="1"/>
                                </GeometryDrawing.Pen>
                                <GeometryDrawing.Geometry>
                                    <PathGeometry>
                                        <PathFigure>
                                            <PolyLineSegment>
                                                <PolyLineSegment.Points>
                                                    <Point X="2" Y="{Binding ???}"/>
                                                </PolyLineSegment.Points>
                                            </PolyLineSegment>
                                        </PathFigure>
                                    </PathGeometry>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>
                        </DrawingImage.Drawing>
                    </DrawingImage>
                </Image.Source>
            </Image>
        </Grid>
    </DataTemplate>

</Page.Resources>
<Grid Background="#DDD">
    <StackPanel>
        <ListBox
           Background="#999"
           BorderThickness="2"
           BorderBrush="White"
           Margin="10"
           ItemsSource="{Binding Source={StaticResource TestData}, XPath=Stage}"
           ItemTemplate="{StaticResource TestDataTemplate}"/>
    </StackPanel>
</Grid>

我需要使用XmlDocument的Curve部分的Point数据构建一条曲线。 我无法理解如何绑定到PolylineSegment的点。有没有办法如何在没有xaml-behind代码的情况下仅在XAML中构建它。问题我无法绑定到任何点的x和y坐标,因为它不是依赖对象。我需要唯一的XAML代码。

计算x坐标。它以0开始,并且由xstep为每个新点增加。所以第一个点的x坐标是0,第二个是2,第三个是4等等.y坐标被当作Point标签的Value元素的值。

提前致谢!

1 个答案:

答案 0 :(得分:0)

你被Y的{​​{1}}属性所困,你可能无法绑定它,因为它不是依赖属性,所以这种方法可能无法帮助你

我确实试图根据你的评论达到同样的效果。

Point

你还需要一个转换器,因为必须计算点数

<Grid Background="#DDD"
      xmlns:l="clr-namespace:CSharpWPF">
    <Grid.Resources>
        <XmlDataProvider x:Key="TestData"
                         XPath="/Base">
            <x:XData>
                <Base xmlns="">
                    <Stage>
                        <Curve xstep="2">
                            <Point Value="10" />
                            <Point Value="50" />
                            <Point Value="20" />
                            <Point Value="50" />
                            <Point Value="30" />
                        </Curve>
                    </Stage>
                </Base>
            </x:XData>
        </XmlDataProvider>
        <l:PointConverter x:Key="PointConverter" />
    </Grid.Resources>
    <StackPanel>
        <ListBox Background="#999"
                 BorderThickness="2"
                 BorderBrush="White"
                 Margin="10"
                 ItemsSource="{Binding Source={StaticResource TestData}, XPath=Stage/Curve}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Polyline Stroke="Red"
                                  StrokeThickness="1"
                                  Points="{Binding Converter={StaticResource PointConverter}}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Grid>

结果

result

看看这是否符合预期。让我知道它是否不同