c# - WPF:在后面的代码中访问转换后的 Canvas 坐标
问题描述
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 参数,以便我可以可视化转换后的项目位置?还是我应该以不同的方式来做?谢谢。
解决方案
您可以设置一个 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 绑定到它们
如果您将其全部打包在控件中,这可能会更好
推荐阅读
- html - 静态 HTML 元素是否不受定位元素的影响?
- c# - Calculated percentage from total values with segmentation analysis
- python - Python 函数在一定百分比的时间内返回一个值
- java - 如何将 if 语句中的输入放回程序中
- sql-server - 在 SQL Server 中获取从周日到周六开始的周期间
- laravel - 如果急切加载的值具有价值,则仅返回雄辩的结果?
- c++ - LLVM Pass 在特定地址分配内存
- php - 从 Woocommerce 元框访问自定义函数中的 Order 对象
- php - 模数和除法运算符一起工作,即使没有任何连接
- python - 计算方差,python中的标准差