【问题标题】:How to get the X,Y position of a UserControl within a Canvas如何在 Canvas 中获取 UserControl 的 X、Y 位置
【发布时间】:2011-02-18 10:30:26
【问题描述】:

我有一个简单的 UserControl,如下所示 - 我将其放置在 Canvas 中。我使用多点触控移动它,我希望能够使用程序 C# 代码读取它的新 X、Y 位置。理想情况下,我希望将 X 和 Y 作为两个属性或作为一个点 (X,Y)。

<UserControl x:Class="TouchControlLibrary.myControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="64" d:DesignWidth="104">
    <Border Name="ControlBorder" BorderThickness="1" BorderBrush="Black">
        <DockPanel Margin="1" Height="60 " Width="100">
            <StackPanel  DockPanel.Dock="Left" Background="Gray"  Width="20" >
                <Button Background="#FFDEDE53" Padding="0">In</Button>
            </StackPanel>
            <StackPanel  DockPanel.Dock="Right" Background="Gray"  Width="20" >
                <Button Background="#FFE8B48F" Padding="0">Out</Button>
            </StackPanel>
        </DockPanel>  
    </Border>
</UserControl>

我希望为“X”和“Y”中的每一个创建一个附加属性,并使用绑定或某种形式的附加属性或???从 Canvas.Left 和 Canvas.Top 填充它们。我花了相当长的时间寻找解决方案,但我发现的一切似乎都“不是完全需要的”。

【问题讨论】:

  • 那么,为什么不直接使用 Canvas.Left 和 Top 属性呢?
  • 我的 UserControl 有多个实例,但 Canvas.left 不存在。我确实尝试过 Canvas.Getleft(myControl1),虽然它返回了一个值,但在我移动实例时这并没有改变。

标签: wpf user-controls attached-properties


【解决方案1】:

你可以在你的用户控件中使用这样的两个属性,

    public double Top
    {
        get
        {
            if (double.IsNaN(Canvas.GetTop(this)))
            {
                return (double)0;
            }
            return Canvas.GetTop(this);
        }

        set
        {
            Canvas.SetTop(this, value);
        }
    }

检查“NotANumber”并不是必需的,但我用它来防止错误。

【讨论】:

  • 我添加了这个,它确实返回了正确的“Top”值,但是当我移动控件时,这并没有反映在属性值中,也就是说,它没有改变。 .我的主程序确实有一个 Canvas,其中有一个 Canvas,而 Control 位于内部 Canvas 内。
  • 可能是您将包含您的控件的画布与您的控件一起移动?
  • 不,它在内部画布内移动,如果我移动内部画布,控件也会随之移动。此外,我只是移动了内部画布,并且 Top 属性返回了相同的初始值。如果我在运行程序之前更改了用户控件的位置,它确实会改变 - 所以实际上我得到了初始 X,Y - 但没有改变。似乎我需要以某种方式调用“依赖属性”。
  • 很奇怪,因为我把我的例子从我的程序中拿出来,效果很好
  • 当然,我会尝试将它添加到..(StackOverFlow 有史以来第一次,所以请耐心等待。移动是在 Windows 7 下通过多点触控完成的,所以它很长......基本上在 ManipulationDelta 事件中,我获得了用户控件(称为加密器)信息 - 并使用增量移动对控件进行转换。所以这里是 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2020-07-29
  • 2022-08-02
相关资源
最近更新 更多