Я надеюсь, что не буду глупо спрашивать об этом, но я пытаюсь создать средство просмотра графиков в WPF, являющееся новичком в этой среде; хотя я и придумал пару решений своих проблем, тот, которым я больше всего горжусь ... не работает там, где должен. Я пытаюсь поместить узел в ItemsControl в позицию, которую я вычислил с помощью alg Дейкстры + некоторые математические вычисления. Проблема в том, что при использовании обычной привязки X и Y я перемещаюсь в верхнем левом углу TextBlock с границей, но вместо этого я хочу манипулировать их center . Таким образом, мои узлы заканчиваются смещением вниз и вправо от указанной мной точки, а не по центру.
Наконец-то я остановился на Multibinding, используя свойство X / Y моей NodeViewModel и ActualWidth / Height сетки. В результате все мои узлы размещаются в (0,0) ! Я даже отладил код и посмотрел на конвертер, но возвращаемое значение кажется нормальным. Я даже пробовал некоторые случайные вещи, такие как привязка к другим свойствам и т. Д.
Я полностью озадачен.
Так что один вопрос - работает ли MultiBinding таким образом? Или я совершаю какую-то глупую ошибку? Я выложу свой конвертер под кодом XAML. Вырезанные части в XAML - это всплывающая подсказка и встроенный ItemsControl, но вырезание из них ничего не меняет (кроме улучшения ясности кода). Приведение в конвертере происходит потому, что приведение непосредственно к float не работает для меня (но это не имеет значения - оно работает так, как есть, даже если оно не очень красиво).
И еще один вопрос - могу ли я сделать это более простым способом? Как манипулировать центром 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();
}
}
Ура,
Michael