Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在栅格控件内使多边形居中_Wpf_Silverlight_Xaml - Fatal编程技术网

Wpf 在栅格控件内使多边形居中

Wpf 在栅格控件内使多边形居中,wpf,silverlight,xaml,Wpf,Silverlight,Xaml,有人能告诉我如何在网格控件的给定行/列内使多边形对象居中吗 我尝试过的示例取自msdn <Grid x:Name="LayoutRoot" > <Polygon Points="300,200 400,125 400,275 300,200" Stroke="Purple" StrokeThickness="2" HorizontalAlignment="Center" Vertic

有人能告诉我如何在网格控件的给定行/列内使多边形对象居中吗

我尝试过的示例取自msdn

<Grid x:Name="LayoutRoot" >
  <Polygon Points="300,200 400,125 400,275 300,200" 
           Stroke="Purple" 
           StrokeThickness="2"
           HorizontalAlignment="Center"
           VerticalAlignment="Center" >
    <Polygon.Fill>
        <SolidColorBrush Color="Blue" Opacity="0.4" />
    </Polygon.Fill>
 </Polygon>

干杯

Xam添加属性:-

 HorizontalAlignment="Center" VerticalAlignment="Center"

对于
多边形

尽管多边形的边界暗示了高度和宽度,但默认为容器的大小

如果你刚开始

HorizontalAlignment="Center" VerticalAlignment="Center"
它将多边形的左上角定位在中心

您还必须明确设置多边形的高度和宽度以使其居中并保留其边界

添加尺寸的多边形Xaml示例:

<Grid x:Name="LayoutRoot">
   <Path Data="M0.5,41.5 L201,0.5 L302,115 L157.25,157 z" Fill="#FFF4F4F5" Stroke="Black" UseLayoutRounding="False" HorizontalAlignment="Center" VerticalAlignment="Center" Width="302.5" Height="157.5"/>
</Grid>

可能也适用于这里

它使用
中心转换器

public class CenterConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue)
        {
            return DependencyProperty.UnsetValue;
        }

        double width = (double) values[0];
        double height = (double)values[1];

        return new Thickness(-width/2, -height/2, 0, 0);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
然后像这样将其绑定到XAML中

<Canvas>
    <TextBlock x:Name="txt" Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM">
        <TextBlock.Margin>
            <MultiBinding Converter="{StaticResource centerConverter}">
                    <Binding ElementName="txt" Path="ActualWidth"/>
                    <Binding ElementName="txt" Path="ActualHeight"/>
            </MultiBinding>
        </TextBlock.Margin>
    </TextBlock>
    <Rectangle Canvas.Left="39" Canvas.Top="39" Width="2" Height="2" Fill="Red"/>
</Canvas>
像这样在XAML中使用它

<Canvas>
    <TextBlock Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM"
          local:Mover.MoveToMiddle="True"/>
</Canvas>
或者,您可以操作
RenderTransform

另一种选择是绑定到RenderTransform而不是Margin。在这种情况下,转换器将返回

附加属性的回调方法将包含以下行:

此替代方案的优点是附加属性的效果在Visual Studio designer中可见(设置边距属性时并非如此)

在XAML中,这将如下所示:

<Canvas>
    <TextBlock x:Name="txt" Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM">
        <TextBlock.RenderTransform>
            <MultiBinding Converter="{StaticResource centerConverter}">
                    <Binding ElementName="txt" Path="ActualWidth"/>
                    <Binding ElementName="txt" Path="ActualHeight"/>
            </MultiBinding>
        </TextBlock.RenderTransform>
    </TextBlock>
    <Rectangle Canvas.Left="39" Canvas.Top="39" Width="2" Height="2" Fill="Red"/>
</Canvas>

TextBlock
是原始答案所涉及的控件。这种方法应该适用于类
UIElement
的所有对象


注:以上链接答案的原始海报将全部归功于此

@HiTechMagic:您如何定义容器和多边形?我看了你的帖子后,在一个简单的网格和4点多边形的例子中,我没有看到它在拉伸。@HiTechMagic:我和Wonko有同样的问题。尽管遵循您的方向,但我无法使简单多边形(在我的例子中是三角形)在网格控件内居中。@Wonko&Xam:我的错误。默认情况下,我在多边形上设置了填充。答案已更正。但基本解决方案是相同的。确保将大小设置为多边形的边界。Cheers@HiTechMagic:再次感谢。你能提供一个xaml片段来演示你是如何获得这个结果的吗?@Xam:xaml添加在上面。查看并更正Xaml会更有用。我的作品是用钢笔工具在Blend中创作的简单多边形。
Mover.SetMoveToMiddle(UIElement, true);
return new TranslateTransform(-width / 2, -height / 2);
if ((bool)e.NewValue)
{
    ...
    element.SetBinding(UIElement.RenderTransformProperty, multiBinding);
}
else
{
    element.ClearValue(UIElement.RenderTransformProperty);
}
<Canvas>
    <TextBlock x:Name="txt" Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM">
        <TextBlock.RenderTransform>
            <MultiBinding Converter="{StaticResource centerConverter}">
                    <Binding ElementName="txt" Path="ActualWidth"/>
                    <Binding ElementName="txt" Path="ActualHeight"/>
            </MultiBinding>
        </TextBlock.RenderTransform>
    </TextBlock>
    <Rectangle Canvas.Left="39" Canvas.Top="39" Width="2" Height="2" Fill="Red"/>
</Canvas>