WPF Data привязка: расположение элемента привязки данных на экране к тексту TextBlock - PullRequest
1 голос
/ 23 декабря 2010

Вот мой XAML:

<Window x:Class="Gui.Wpf.MoveElementWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converters="clr-namespace:Gui.Wpf.Converters" 
    Title="Move the red element" Height="300" Width="500">

    <Window.Resources>    
        <!-- Converter for element location -->
        <converters:LocationConverter x:Key="LocationConverter" />
    </Window.Resources>

    <Grid>

        <Rectangle 
            Name="RedRectangle" 
            Width="150" 
            Height="80" 
            Stroke="Black" 
            Fill="Red" 
            MouseDown="RedRectangle_MouseDown" 
            MouseMove="RedRectangle_MouseMove" />

        <TextBlock 
            Name="StatusTextBlock" 
            HorizontalAlignment="Left" 
            VerticalAlignment="Bottom" />

    </Grid>

</Window>

Я хочу иметь возможность привязывать данные RedRectangle на экране к свойству StatusTextBlock Text, т.е. я хочу StatusTextBlock сказать: "Расположение красного прямоугольника: 12, 18", например.

Я создал конвертер для преобразования Point в String:

[ValueConversion(typeof(Point), typeof(String))]
public class LocationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        Point location;
        string valueString;

        location = (Point)value;

        valueString = string.Format("Red rectangle's location is: {0}, {1}", 
                                     location.X, location.Y);

        return valueString;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Чего я не знаю, так это как данные связывают местоположение прямоугольника, поскольку это не такпредоставляется через свойство, но вместо этого через метод: RedRectangle.PointToScreen(new Point(0,0));.Пожалуйста, помогите, спасибо.

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Проблема в том, что ваш прямоугольник находится внутри неправильного типа панели (или контейнера). Вы используете Grid, который размещает своих дочерних элементов в ячейки, определяемые количеством строк / столбцов. Вам нужен контейнер, который позволяет указать местоположение в виде координат пикселей. Для этого вам нужен холст:

<Canvas>
    <Rectangle 
        Name="RedRectangle" 
        Canvas.Left="{Binding Path=Text, ElementName=StatusTextBlock, Converter={StaticResource LocationConverterLeft}}"  
        Canvas.Top="{Binding Path=Text, ElementName=StatusTextBlock, Converter={StaticResource LocationConverterTop}}"
        Width="150" 
        Height="80" 
        Stroke="Black" 
        Fill="Red" 
        MouseDown="RedRectangle_MouseDown" 
        MouseMove="RedRectangle_MouseMove" />
</Canvas>

Обратите внимание, что вам понадобятся конвертеры, один для верхнего и другой для левого свойства.

0 голосов
/ 23 декабря 2010

Вы можете передать сам элемент и затем вызвать метод:

public class LocationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        var uiElement = value as UIElement;
        if (uiElement == null)
            return "";

        var location = uiElement.PointToScreen(0,0);

        valueString = string.Format("Red rectangle's location is: {0}, {1}", 
                                     location.X, location.Y);

        return valueString;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

И привязка будет:

<TextBlock Text={Binding ElementName=RedRectangle}" Name="StatusTextBlock" HorizontalAlignment="Left" VerticalAlignment="Bottom" />

Не пробовал, но это должно работать.

...