私はこれをばかげているのではないことを願っていますが、フレームワークのまったく新しいものである 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();
}
}
乾杯、マイケル