Почему MultiBinding TranslateTransform.X не работает в WPF? - PullRequest
2 голосов
/ 27 февраля 2010

Я надеюсь, что не буду глупо спрашивать об этом, но я пытаюсь создать средство просмотра графиков в 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

Ответы [ 2 ]

0 голосов
/ 28 февраля 2010

Если вы установите RenderTransformOrigin = ". 5, .5" в Grid, он должен работать с привязкой к вашим исходным значениям.

0 голосов
/ 27 февраля 2010

Как я и думал - глупая ошибка. Преобразованное свойство имеет точность double и ему не может быть присвоено значение float. Мне нужно было научиться включать выходные данные отладки, чтобы увидеть это.

...