[英]Is UIElement.RenderTransform used by TransformToAncestor?
[英]XAML - How to invert a UIElement.RenderTransform?
我试图在XOD文件中添加水印(据我所知,XOD与XPS文件非常相似)。 在XOD内部,有一些XAML文件包含如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<FixedPage xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:x="http://schemas.microsoft.com/xps/2005/06/resourcedictionary-key" xml:lang="EN" Width="725.66667" Height="990.236">
<Canvas RenderTransform="1.3333333,0,0,-1.3333333,0,990.236">
....
</Canvas>
</FixedPage>
我想在Canvas中插入我的水印,但我想将它放在每个文档的相同页面位置。 问题是RenderTransform
正在从一个文档更改为文档,所以我应该计算逆变换来做到这一点(我还想过将旧的Canvas
元素包装到一个没有RenderTransform
的新Canvas
,但我真的不喜欢这个) 。
我找到了一些相关的文档和问题:
http://msdn.microsoft.com/en-us/library/ms750596(v=vs.110).aspx
<Canvas RenderTransform="m11, m12, m21, m22, offsetX, offsetY">
m11 m12 0 a b 0
m21 m22 0 or c d 0
offx offy 1 tx ty 1
......我计算了我认为的逆矩阵:
float det = a * d - b * c;
float ia, ib, ic, id, itx, ity;
ia = d / det;
ib = -b / det;
ic = -c / det;
id = a / det;
itx = (c * ty - d * tx) / det;
ity = -(a * ty - b * tx) / det;
...并将其乘以我想要的变换,p([f] = [i] * [p]):
float pa = 60, pb = -60, pc = 60, pd = 60, ptx = 20, pty = 20;
float fa, fb, fc, fd, ftx, fty;
fa = ia * pa + ib * pc;
fb = ia * pb + ib * pd;
fc = ic * pa + id * pc;
fd = ic * pb + id * pd;
ftx = itx * pa + ity * pc + ptx;
fty = itx * pb + ity * pd + pty;
那么我在Canvas
元素将是:
<Glyphs RenderTransform="fa, fb, fc, fd, ftx, fty" .... />
但这似乎不适用于偏移系数。 他们似乎得到了太大的价值,并走出了页面。 然而,M **系数似乎是正确的。 我在这里错过了什么吗? 翻译系数是否应该以另一种方式计算?
使用:
ftx = ptx - tx;
fty = pty + pageHeight - ty;
..看起来为大多数RenderTransforms提供了类似的结果,但不是全部。
编辑:我尽量避免使用任何WPF程序集,因为我不需要任何其他功能。
如果我理解正确你只想计算RenderTransform的逆,那你为什么不使用RenderTransforms底层矩阵的Invert()函数?
Transform t = elem.RenderTransform;
if(t.Value.HasInverse) {
t.Value = t.Value.Invert();
elem.RenderTransform = t;
}
elem是你的UIElement。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.