0

WPF 中是否可以访问代码隐藏文件中的画布面板(在 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>

我还想通过弹出窗口在鼠标悬停时显示我的项目在画布内的当前位置。我目前正在尝试这种方式:

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 内的画布 X 坐标(这对我来说很有意义)。但是,我想显示画布的比例转换“坐标”。

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

4

1 回答 1

0

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

像这样粗略的东西:

<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 绑定到它们

如果您将其全部打包在控件中,这可能会更好

于 2021-08-16T22:12:15.190 回答