2

私はこれをばかげているのではないことを願っていますが、フレームワークのまったく新しいものである WPF でグラフ ビューアーを設計しようとしています。私は自分の問題に対するいくつかの解決策を思いつきましたが、私が最も誇りに思っている解決策は...本来あるべき場所で機能しません。私がやろうとしているのは、ダイクストラの alg + いくつかの数学で計算した位置に ItemsControl にノードを配置することです。問題は、通常の X および Y Binding を使用するときに移動するのは、Border を持つ TextBlock の左上隅ですが、代わりに操作したいのはその中心です。したがって、私のノードは、指定したポイントの中心ではなく、そのポイントから右に突き出てしまいます。

最終的に、NodeViewModel の X/Y プロパティとグリッドの ActualWidth/Height を使用してマルチバインディングに落ち着きました。何が起こるかというと、すべてのノードが (0,0) に配置されます! 私もコードをデバッグしてコンバーターを見ましたが、戻り値は問題ないようです。他のプロパティへのバインドなど、いくつかのランダムなことも試しました。

私は完全に困惑しています。

1 つの質問は、MultiBinding がそのように機能するかどうかです。それとも私は愚かな間違いを犯していますか?Converter を 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

グリッドで RenderTransformOrigin=".5,.5" を設定すると、元の値へのバインドで機能するはずです。

于 2010-02-28T15:07:24.663 に答える
0

思った通り - ばかげた間違い。変換されたプロパティは倍精度であり、float を割り当てることはできません。それを確認するには、デバッグ出力をオンにする方法を学ばなければなりませんでした。

于 2010-02-27T18:02:48.113 に答える