【问题标题】:Center a polygon within a Grid control在 Grid 控件中居中多边形
【发布时间】:2010-09-21 11:58:02
【问题描述】:

谁能告诉我如何在网格控件的给定行/列中将多边形对象居中?

我试过的例子取自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

【问题讨论】:

    标签: wpf silverlight xaml


    【解决方案1】:

    添加属性:-

     HorizontalAlignment="Center" VerticalAlignment="Center"
    

    Polygon

    【讨论】:

      【解决方案2】:

      虽然多边形的边界隐含了高度和宽度,但它默认为容器的大小。

      如果你只是设置

      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>
      

      【讨论】:

      • @HiTechMagic:你是如何定义你的容器和多边形的?在看到您的帖子后我拼凑的一个快速示例中,我没有看到它使用简单的网格和 4 点多边形进行拉伸。
      • @HiTechMagic:我和 Wonko 有同样的问题。尽管按照您的指示,我无法让一个简单的多边形(在我的例子中是一个三角形)在 Grid 控件中居中。
      • @Wonko & Xam:我的错。默认情况下,我在多边形上设置了填充。答案更正。基本解决方案是相同的。确保将大小设置为多边形的边界。干杯
      • @HiTechMagic:再次感谢。您能否提供一个 xaml sn-p 来演示您是如何实现此结果的?
      • @Xam: Xaml 添加在上面。查看和更正您的 Xaml 会更有用。我的是使用 Blend 中的钢笔工具创作的简单多边形。
      【解决方案3】:

      也许this answer 也适用于此。

      它使用CenterConverter

      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>
      

      为了能够在 C# 中使用它,而不仅仅是在 XAML 中,你需要这个类

      public class Mover : DependencyObject
      {
          public static readonly DependencyProperty MoveToMiddleProperty =
              DependencyProperty.RegisterAttached("MoveToMiddle", typeof (bool), typeof (Mover),
              new PropertyMetadata(false, PropertyChangedCallback));
      
          public static void SetMoveToMiddle(UIElement element, bool value)
          {
              element.SetValue(MoveToMiddleProperty, value);
          }
      
          public static bool GetMoveToMiddle(UIElement element)
          {
              return (bool) element.GetValue(MoveToMiddleProperty);
          }
      
          private static void PropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
          {
              FrameworkElement element = sender as FrameworkElement;
              if (element == null)
              {
                  return;
              }
      
              if ((bool)e.NewValue)
              {
                  MultiBinding multiBinding = new MultiBinding();
                  multiBinding.Converter = new CenterConverter();
                  multiBinding.Bindings.Add(new Binding("ActualWidth") {Source = element});
                  multiBinding.Bindings.Add(new Binding("ActualHeight") {Source = element});
                  element.SetBinding(FrameworkElement.MarginProperty, multiBinding);
              }
              else
              {
                  element.ClearValue(FrameworkElement.MarginProperty);
              }
          }
      
      }
      

      像这样在 XAML 中使用它

      <Canvas>
          <TextBlock Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM"
                local:Mover.MoveToMiddle="True"/>
      </Canvas>
      

      或者在C#中像这样

      Mover.SetMoveToMiddle(UIElement, true);
      

      您也可以操作RenderTransform

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

      return new TranslateTransform(-width / 2, -height / 2);
      

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

      if ((bool)e.NewValue)
      {
          ...
          element.SetBinding(UIElement.RenderTransformProperty, multiBinding);
      }
      else
      {
          element.ClearValue(UIElement.RenderTransformProperty);
      }
      

      此替代方法的优点是附加属性的效果在 Visual Studio 设计器中可见(设置 Margin 属性时不是这种情况)。

      在 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 虽然。

      注意:所有功劳归于上述链接答案的原始发帖人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 2013-06-28
        • 1970-01-01
        • 2014-01-23
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多