silverlight - 在 Silverlight/WinRT 中仅使用 XAML 将元素定位在 Canvas 内的中心(而不是左上角)

标签 silverlight xaml canvas windows-runtime centering

关于在 Canvas 中定位元素的常见问题是“如何定位元素的中心(而不是左上角)”。

提出了几种解决方案,但它们都有缺点。

是否有一个简单的(仅 XAML)方法可以将元素定位在 Canvas 内,以便其 Canvas.LeftCanvas.Top 对应于元素的center AND 大小和位置属性可以绑定(bind)到其他一些属性吗?

我在 WPF 中找到了一种非常简单的方法来执行此操作(只需设置 Margin="-1000000" Positioning an element inside the Canvas by its center (instead of the top left corner) using only XAML in WPF ),但它不适用于 Silverlight/WinRT。我知道的唯一其他方法需要创建 ValueConverter 来执行 x *= -0.5 计算(这不是仅限 XAML)。

最佳答案

虽然它不太漂亮,但下面是一个使用不同原点的嵌套 RenderTransform 来偏移对象位置以使其居中的示例:

<UserControl x:Class="UrlTest.Center"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Canvas x:Name="LayoutRoot" Background="White">
        <ContentControl Canvas.Top="100" Content="{Binding ActualWidth,ElementName=Center, StringFormat=Width \{0\}}"/>
        <ContentControl Canvas.Top="120" Content="{Binding ActualHeight,ElementName=Center, StringFormat=Height \{0\}}"/>
        <Grid x:Name="Center" RenderTransformOrigin="-.5,-.5" Canvas.Left="40" Canvas.Top="25">
            <Grid.RenderTransform>
                <ScaleTransform ScaleX="-1" ScaleY="-1"/>
            </Grid.RenderTransform>
            <Grid RenderTransformOrigin="-.25,-.25">
                <Grid.RenderTransform>
                    <ScaleTransform ScaleX="-1" ScaleY="-1"/>
                </Grid.RenderTransform>
                <Ellipse Width="80" Height="50" Fill="Aquamarine"/>
                <ContentControl FontSize="20" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">Center</ContentControl>
            </Grid>
        </Grid>
    </Canvas>
</UserControl>

内部的Grid用于创建变换,而外部的Canvas用于确保其内部的Grid设置其大小与其内部内容的大小相同。

关于silverlight - 在 Silverlight/WinRT 中仅使用 XAML 将元素定位在 Canvas 内的中心(而不是左上角),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219591/

相关文章:

javascript - 在 HTML Canvas 上用 JavaScript 克隆一个移动的球

c# - 无法解析资源 'ImageConverter'

c# - 如何提取 xaml/xml 文件中特定标签的所有出现?

c# - 在 WPF 中创建自定义 UI 元素

xaml - 两种纵横比的两种布局 (4 :3 and 16:9) - changing automatically

javascript - 在 Canvas 中拖动图像并调整其大小(移动设备)

gwt - 使用具有大量数据的 post 请求调用 servlet 并在新选项卡中打开 url

multithreading - 如何使用 TableServiceContext.BeginSaveChanges 创建 Silverlight 单元测试?

c# - 修改绑定(bind) DataGrid 的结果

Silverlight 在特定时间安排事件