Canvas метод getRight возвращает Nan - PullRequest
0 голосов
/ 19 октября 2019

У меня есть Прямоугольник, который я пытаюсь перетащить в Canvas. После завершения перетаскивания я хочу получить координаты слева, сверху, справа и снизу. Для этого, когда я говорю Canvas.GetRight (dragableThumb) и Canvas.GetBottom (dragableThumb), он возвращает NaN для обоих значений.

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

var right = this.Width - left - dragableThumb.ActualWidth;var bottom = this.Height - top - dragableThumb.ActualHeight;

Вот весь код.

xaml:

<Window.Resources>
        <ControlTemplate x:Key="myDragableCT">
            <Rectangle 
x:Name="Arrow" 
Height="94" RenderTransformOrigin="0.5,0.5" Width="128">
                <Rectangle.Fill>
                    <SolidColorBrush Color="Green" />
                </Rectangle.Fill>
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1" ScaleY="1"/>
                        <SkewTransform AngleX="0" AngleY="0"/>
                        <RotateTransform Angle="0"/>
                        <TranslateTransform X="0" Y="0"/>
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
        </ControlTemplate>
    </Window.Resources>
    <Canvas x:Name="DragableCanvas">
        <Thumb x:Name="dragableThumb" DragDelta="DragableThumb_DragDelta" DragCompleted="DragableThumb_DragCompleted" Canvas.Left="331"
                   Canvas.Top="112" Template="{StaticResource myDragableCT}"></Thumb>
    </Canvas>
</Window>

Код сзади:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void DragableThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Canvas.SetLeft(dragableThumb, Canvas.GetLeft(dragableThumb) + e.HorizontalChange);
            Canvas.SetTop(dragableThumb, Canvas.GetTop(dragableThumb) + e.VerticalChange);
        }

        private void DragableThumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            var left = Canvas.GetLeft(dragableThumb);
            var top = Canvas.GetTop(dragableThumb);
            var right = this.Width - left - dragableThumb.ActualWidth;
            var bottom = this.Height - top - dragableThumb.ActualHeight;
            MessageBox.Show(string.Format("left:{0}, top:{1}, right:{2}, bottom:{3}", left, top, right, bottom));
        }
    }

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Canvas.Left, Canvas.Top, Canvas.Right и Canvas.Bottom являются свойствами макета вместо свойств рендеринга. Четыре свойства используются для ограничения макета UIElements, но не представляют состояния макета. Это поведение аналогично свойствам Width и Height.

<Grid>
    <Button x:Name="DemoButton" />
</Grid>

См. Этот код выше, если мы прочитаем свойства Width и Height, мы обнаружим, что они оба double.NaN. Только если мы прочитаем свойства ActualWidth, ActualHeight или RenderSize, мы сможем получить правильные состояния макета.

То же, что Canvas.Left, Canvas.Top, Canvas.Right и Canvas.Bottomсвойства. Вы можете получить право и снизу, используя другие методы, такие как:

var right = Canvas.GetLeft(dragableThumb) + dragableThumb.ActualWidth;
var bottom = Canvas.GetTop(dragableThumb) + dragableThumb.ActualHeight;

Если вы хотите метод для всех других ситуаций, вы можете попробовать этот код ниже:

var bounds = new Rect(
    dragableThumb.TranslatePoint(default, DragableCanvas),
    dragableThumb.TranslatePoint(new Point(dragableThumb.ActualWidth, dragableThumb.ActualHeight), DragableCanvas));
var right = bounds.Right;
var bottom = bounds.Bottom;

Кстати, вы написали неправильно dragable. Правильное заклинание draggable.

1 голос
/ 19 октября 2019

Должно быть:

var right = left + dragableThumb.ActualWidth;
var bottom = top + dragableThumb.ActualHeight;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...