c# - RenderTransformOrigin 不起作用。UWP
问题描述
我有一个问题,我不明白如何解决它。我有一个 UWP 应用程序。在 XAML 中有一个具有 RenderTransformOrigin 的网格。但是当我改变网格的宽度时,我会给它什么值并不重要,宽度是从中心计算的。
这是 XAML
<Page
x:Class="TestApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid Background="White">
<Grid Background="Red" x:Name="image" RenderTransformOrigin="0,0">
<Grid.RenderTransform>
<CompositeTransform />
</Grid.RenderTransform>
<Border x:Name="LeftScale" Width="50" Height="50" Background="Black" HorizontalAlignment="Left" VerticalAlignment="Center" ManipulationDelta="LeftScale_ManipulationDelta" ManipulationMode="TranslateX,TranslateY" />
</Grid>
</Grid>
和 C#
public sealed partial class MainPage : Page
{
public Point Origin { get; set; }
public MainPage()
{
this.InitializeComponent();
image.Width = 500;
image.Height = 500;
}
private void LeftScale_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
Origin = new Point(1, 0.5);
image.RenderTransformOrigin = Origin;
image.Width -= e.Delta.Translation.X;
}
}
感谢关注。
解决方案
RenderTransformOrigin
适合转型。这个转换需要由CompositeTransform
你定义的来完成。它不能通过更改Width
属性来更改。
您可以重写代码并尝试以下操作:
页面.xaml
<StackPanel>
<Grid Background="Red" x:Name="image" RenderTransformOrigin="0,0" HorizontalAlignment="Center">
<Grid.RenderTransform>
<CompositeTransform x:Name="imageCompositeTransform"/>
</Grid.RenderTransform>
</Grid>
<Slider Maximum="500"
HorizontalAlignment="Center"
Width="500"
Margin="0,30,0,0"
ValueChanged="Slider_ValueChanged"/>
</StackPanel>
页面.xaml.cs
public Point Origin { get; set; }
public MainPage()
{
this.InitializeComponent();
image.Width = 500;
image.Height = 500;
}
private void Slider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
Origin = new Point(1, 0.5);
image.RenderTransformOrigin = Origin;
var proportion = e.NewValue / image.Width;
imageCompositeTransform.ScaleX = 1 - proportion;
}
ScaleX
通过(not Width
)变换控件的宽度,使其RenderTransformOrigin
生效。
更新
如果您希望通过原始代码对 Grid 进行宽度转换,方法如下:
private double moveX = 0;
private void LeftScale_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
moveX -= e.Delta.Translation.X;
var proportion = moveX / image.Width;
imageCompositeTransform.ScaleX = 1 - proportion;
}
但是,因为你Rectangle
在里面Grid
,所以Rectangle
当Grid
宽度变换时,宽度也会改变。如果要保持大小Rectangle
不变,建议将其移出。
此致。
推荐阅读
- python - 基于 sqlite DB 值的 Python 依赖组合框
- mysql - 从 3 个不同的表中选择 3 个不同的列 (COUNT) 并按日期分组
- flutter - 如何将数据库作为构造函数参数传递给......类并将其用作实例变量而不是使用 Provider.of
- cmake - 共享库中的CMake意外的传递私有依赖
- flutter - Flutter中是否有像TextEditingController这样的复选框控制器?
- xamarin.android - 相机屏幕周围的自定义边框
- python - 无法在 anaconda (Spyder) 中为 python 安装 googleads 模块
- javascript - PhpStorm 错误地认为 Event 构造函数没有任何参数
- promise - Rust/Webassembly/wasm-bindgen - 从 `js_sys' Promise 中获取值
- python - 计算两点之间的距离,如果 <1:添加到列表 x 和 y 坐标(人口程序)Python