WPF:在隐藏代码中访问转换后的 Canvas 坐标

WPF: Access transformed Canvas coordinates in code behind

在 WPF 中有没有办法在代码隐藏文件中访问 Canvas 面板(在 xaml 文件中创建)的 ScaleTransform 参数?

用例示例:

我想在缩放后的 Canvas 中放置一个项目列表,如下所示:

<ItemsControl MouseMove="Control_MouseMove">
    <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                    <Canvas>
                        <Canvas.RenderTransform>
                              <TransformGroup>
                                   <ScaleTransform>
                                        <ScaleTransform.ScaleX />
                                   </ScaleTransform>
                              </TransformGroup>
                        </Canvas.RenderTransform>
                    </Canvas>
             </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>
</ItemsControl>

我还想在 Canvas 鼠标悬停时用弹出窗口显示我的项目在 Canvas 中的当前位置。我目前正在尝试这种方式:

public void Control_MouseMove(object sender, MouseEventArgs e) {
    if (!this.Popup.IsOpen)
        this.Popup.IsOpen = true;
    var mousePosition = e.GetPosition(this.SwLane);
    this.Popup.HorizontalOffset = mousePosition.X + 10;
    this.Popup.VerticalOffset = mousePosition.Y - 20;
    this.PopupContent.Text = System.Convert.ToString(mousePosition.X);
}

我得到的是 Popup 中的 canvas X 坐标(这对我来说很有意义)。但是,我想显示 canvas.

的比例转换“坐标”

有没有办法访问代码隐藏中的 ScaleTransform 参数,以便我可以可视化转换后的项目位置?还是我应该以不同的方式来做?谢谢

您可以设置一个 OnInitialized 处理程序,在代码隐藏中构建转换,将其组成的 ScaleTransform 保存为私有 属性,然后在 window 初始化后将其分配到那里

大致是这样的:

<Window x:Class="WpfApp4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Background="White"
        MouseLeftButtonDown="MainWindow_OnMouseLeftButtonDown"
        Initialized="MainWindow_OnInitialized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ItemsControl x:Name="MyItems" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>

        <Rectangle Width="100" Height="200" Stroke="Red" StrokeThickness="5"/>
    </Grid>
</Window>


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

    private TransformGroup MyTransform { get; set; }
    private ScaleTransform SceneScale { get; set; }


    private void MainWindow_OnInitialized(object? sender, EventArgs e)
    {
        MyTransform = new TransformGroup();
        SceneScale = new ScaleTransform(1.0, 1.0, 0, 0);
        MyTransform.Children.Add(SceneScale);
        MyItems.RenderTransform = MyTransform;
    }
}

现在您可以添加 MouseLeftButtonDown 处理程序来缩放事物,例如:

    private void MainWindow_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        SceneScale.ScaleX *= 1.1;
        SceneScale.ScaleY *= 1.1;
    }

对于坐标,将当前坐标公开为属性。当鼠标移动时更新它们。将 UI 绑定到它们

如果将其全部打包到一个控件中可能会更好