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 绑定到它们
如果将其全部打包到一个控件中可能会更好
在 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 绑定到它们
如果将其全部打包到一个控件中可能会更好