2

我希望我不是在傻傻地问这个问题,但我正在尝试在 WPF 中设计一个图形查看器,作为框架中的一个完全新手;尽管我确实为我的问题提出了一些解决方案,但我最引以为豪的一个......并没有在应有的地方发挥作用。我想要做的是将 ItemsControl 上的一个节点放置在我用 Dijkstra 的 alg + 一些数学计算的位置。问题是我在使用普通 X 和 Y 绑定时移动的是带边框的 TextBlock 的左上角,但我想操纵的是它们的中心。因此,我的节点最终会从我指定的点向下并向右移动,而不是以它为中心。

我最终决定使用 NodeViewModel 的 X/Y 属性和 Grid 的 ActualWidth/Height 进行多重绑定。发生的事情是我的所有节点都放置在 (0,0)!我什至调试了代码并查看了转换器,但返回值似乎还可以。我什至尝试了一些随机的东西,比如绑定到其他属性等。

我完全不解。

所以一个问题是——MultiBinding 是这样工作的吗?还是我犯了一些愚蠢的错误?我将在 XAML 代码下方发布我的转换器。XAML 中删减的部分是工具提示和嵌入的 ItemsControl,但删减这些部分并没有改变(除了提高代码的清晰度)。转换器中的铸造是因为直接铸造到浮动对我来说不起作用(但这无关紧要 - 即使它不是很漂亮,它也会以它的方式工作)。

另一个问题是——我可以用更简单的方式来做吗?喜欢直接操纵 TextBlock 的中心?

XAML:

    <Grid>
        <ItemsControl ItemsSource="{Binding Source={StaticResource Nodes}, Path=Nodes}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="vievModels:NodeViewModel">
                    <Grid>
                        <Grid x:Name="nodeGrid">
                            <Grid.RenderTransform>
                                <TranslateTransform>
                                    <TranslateTransform.X>
                                        <MultiBinding Converter="{StaticResource PositionConverter}">
                                            <Binding Path="Position.X"/>
                                            <Binding ElementName="nodeGrid" Path="ActualWidth"/>
                                        </MultiBinding>
                                    </TranslateTransform.X>
                                    <TranslateTransform.Y>
                                        <MultiBinding Converter="{StaticResource PositionConverter}">
                                            <Binding Path="Position.Y"/>
                                            <Binding ElementName="nodeGrid" Path="ActualHeight"/>
                                        </MultiBinding>
                                    </TranslateTransform.Y>
                                </TranslateTransform>
                            </Grid.RenderTransform>
                            <Border BorderBrush="Black" BorderThickness="2" CornerRadius="7">
                                <Border.Background>
                                    <SolidColorBrush Color="{Binding Color}" Opacity="0.5"/>
                                </Border.Background>
                                <TextBlock x:Name="Label" Margin="5,5,5,5" MaxWidth="160" TextAlignment="Center" TextWrapping="Wrap" FontFamily="Lucida Console" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Path=Label}"/>
                            </Border>
...
                        </Grid>
...
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas Background="Transparent"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>

C#:

public class PositionConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        float point = float.Parse(values[0].ToString());
        float size = float.Parse(values[1].ToString());
        return point - size / 2;

    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

干杯,迈克尔

4

2 回答 2

0

就像我想的那样——一个愚蠢的错误。转换后的属性是精度的,不能为其分配浮点数。我必须学习如何打开调试输出才能看到它。

于 2010-02-27T18:02:48.113 回答
0

如果您在 Grid 上设置 RenderTransformOrigin=".5,.5",它应该与您的原始值绑定。

于 2010-02-28T15:07:24.663 回答