我正在使用 UWP 并使用 Composition API 以编程方式缩放嵌套在典型 XAML 层次结构中的子文本视觉对象。我们应用程序中的文本块包含在边框之类的东西中,其中许多边框是 GridView 中包含的项目。
在许多情况下,我都遇到了相关文本视觉对象的剪切,因为它缩放到比托管元素的某些 XAML 容器大,我希望视觉对象在缩放到大于其父级时不会被剪切。
这是一个准系统示例,演示了我看到的一些问题……</p>
我的测试应用程序以空白 UWP 应用程序开始,我页面的根网格包含以下 Gridview:
<GridView >
<GridViewItem>
<Border PointerPressed="Border_PointerPressed" CornerRadius="5" Width="125" Height="125">
<Grid>
<TextBlock Text="Content String 1" />
</Grid>
</Border>
</GridViewItem>
<GridViewItem>
<Border PointerPressed="Border_PointerPressed" Width="125" Height="125">
<Grid>
<TextBlock Text="Content String 2" />
</Grid>
</Border>
</GridViewItem>
<GridViewItem>
<Border PointerPressed="Border_PointerPressed" Width="125" Height="125">
<Grid>
<TextBlock Text="Content String 3"/>
</Grid>
</Border>
</GridViewItem>
</GridView>
代码隐藏文件包含以下附加 using 语句、变量声明、页面构造函数中的变量初始化和此事件处理程序:
using System.Numerics;
using Windows.UI.Composition;
using Windows.UI.Xaml.Hosting;
Compositor compositor;
public MainPage()
{
this.InitializeComponent();
compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
}
private void Border_PointerPressed(object sender, PointerRoutedEventArgs e)
{
var content = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(sender as FrameworkElement, 0), 0);
var visual = ElementCompositionPreview.GetElementVisual(content as FrameworkElement);
var animation = compositor.CreateVector3KeyFrameAnimation();
animation.InsertKeyFrame(0f, new Vector3(1.0f, 1.0f, 0.0f));
animation.InsertKeyFrame(0.5f, new Vector3(3.0f, 3.0f, 0.0f));
animation.InsertKeyFrame(1f, new Vector3(1.0f, 1.0f, 0.0f));
animation.Duration = TimeSpan.FromMilliseconds(5000);
visual.StartAnimation(nameof(visual.Scale), animation);
}
当您运行应用程序并单击每个字符串时,您最初应该注意到第一个字符串的行为与其他两个字符串不同。
第一个字符串在边框的边界框被裁剪,而其他两个字符串没有。另请注意,其他两个字符串似乎超出了最后一项的边界并进入页面,但这可能是由于 gridview 自动调整大小以填充页面。
第一个字符串与其他两个字符串的区别在于边框上设置了圆角半径属性。我们在我们的应用程序中使用cornerradius 设置,因此很高兴知道是否有一种方法可以覆盖或控制此行为,以便它不会在缩放时剪切视觉对象。
导致我们出现问题的另一个行为是,在 GridView 边界是视觉对象在缩放时剪辑的另一个边界。如果您在 Gridview 上设置任何属性(如 HorizontalAlignment="Center"),使其自身大小调整为所需大小,则视觉对象会在控件边界处被裁剪。
组合 API 中是否有任何东西可以让我阻止或影响这种剪裁行为?