I'm trying to getLeft of a control in WPF. But I always received the NaN value instead of double value. Here is what I'm trying:
XAML:
<Canvas Canvas.Left="230" Name="cnvSaver">
<Border Focusable="False" BorderBrush="#7FBFA379" BorderThickness="0 1" Width="460" Height="460">
<Canvas Background="#3FFFFFFF" AllowDrop="True" Name="cnvViewerLower" Drop="cnvViewerLower_Drop" Height="460" Width="460">
</Canvas>
</Border>
<Border Focusable="False" Name="borUpper" BorderBrush="#7FBFA379" BorderThickness="1 0">
<Border.RenderTransform>
<TranslateTransform x:Name="borUpperTranslate" X="0"/>
</Border.RenderTransform>
<Border.Triggers>
<EventTrigger RoutedEvent="RadioButton.Checked">
<BeginStoryboard>
<Storyboard Name="stbUpperTranslate" Storyboard.TargetName="borUpperTranslate" Storyboard.TargetProperty="X">
<DoubleAnimation RepeatBehavior="Forever" Name="dbaUpperTranslate" From="230" To="0" Duration="0:0:3" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<Canvas Background="#3FEEDBB3" Drop="cnvViewerUpper_Drop" MouseLeftButtonDown="cnvViewerUpper_MouseLeftButtonDown" MouseMove="cnvViewerUpper_MouseMove" MouseLeftButtonUp="cnvViewerUpper_MouseLeftButtonUp" AllowDrop="True" Width="460" Height="460" Name="cnvViewerUpper"></Canvas>
</Border>
</Canvas>
Code behind C#:
Point p = e.GetPosition(cnvSaver);
if (x > p.X)
{
// Move to Left
Border br = cnvViewerUpper.Parent as Border;
double left = Canvas.GetLeft(br) - Math.Abs(p.X - x);
if(left > 0){
Canvas.SetLeft(br, left);
}
MessageBox.Show("move to left");
}
else if (x == p.X)
{
MessageBox.Show("standing");
}
else {
// Move to Right
double left = Canvas.GetLeft(borUpper);
if (left > 0)
{
Canvas.SetLeft(borUpper, left);
}
MessageBox.Show("move to right");
}
Thanks in advance.
you can only get a value for Canvas.GetLeft
for an element, when you have explicitly set it initially, otherwise it would return NaN
(this is expected WPF
behaviour).
same for Height and Width
.
In your case, in your xaml
, you haven't set any Canvas.Left
property on your border
, so when you access it in code, it will return NaN
.
to get the actual left
coordinates, use TranslatePoint
p = localItem.TranslatePoint(new Point(0, 0), br);
double currentLeft = p.X;
double currentTop = p.Y;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With