Xceed Extended WPF Toolkit中Zoombox的ZoomOrigin属性失效问题(WPF)
解决Xceed Zoombox设置ZoomOrigin后缩放失效的问题
我之前也踩过这个坑!你遇到的问题本质是在XAML中直接硬编码ZoomOrigin值时,Zoombox内部的内容还没完成布局渲染,导致这个固定坐标无法正确映射到内容的坐标系上,最终让缩放逻辑罢工了。
问题分析
默认情况下,Zoombox没设置ZoomOrigin时会以自身中心作为缩放原点,这时候它的布局状态是稳定的;但你直接在XAML里写ZoomOrigin="20,20",这个值会在窗口初始化时就被赋值,而此时内部的Image还没完成尺寸计算和位置布局,Zoombox无法识别这个坐标对应的有效内容区域,自然缩放就失效了。
解决方案:延迟到内容加载完成后设置ZoomOrigin
我们可以把ZoomOrigin的赋值逻辑放到窗口加载完成的事件里,确保Image已经渲染完毕,坐标系是有效的。
1. 修改XAML代码
先移除XAML中Zoombox的ZoomOrigin属性,同时给窗口添加Loaded事件:
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> <Grid> <xctk:Zoombox x:Name="zoom"> <Image Source="Green.png" Height="200" Width="200"/> </xctk:Zoombox> </Grid> </Window>
2. 添加后台代码逻辑
在MainWindow.xaml.cs里实现Window_Loaded事件,等内容加载完成后再设置ZoomOrigin:
private void Window_Loaded(object sender, RoutedEventArgs e) { // ZoomOrigin的坐标是以内部内容(这里是Image)的左上角为原点(0,0)的 zoom.ZoomOrigin = new Point(20, 20); }
额外注意点
ZoomOrigin的坐标是相对于Zoombox内部内容的左上角,不是Zoombox自身的左上角,所以要确保你设置的坐标在内容的尺寸范围内(比如你的Image是200x200,那么x和y的取值范围最好在0~200之间)。- 如果需要动态跟随鼠标位置作为缩放原点,可以绑定
ZoomOrigin到鼠标的相对位置,但你要固定原点的话,上面的方法就足够了。
内容的提问来源于stack exchange,提问作者Baugog
相关产品推荐
相关产品推荐

