【问题标题】:How to center an element in wpf canvas如何在wpf画布中居中元素
【发布时间】:2011-01-13 14:51:07
【问题描述】:

如何使用附加属性在 wpf 画布中居中元素?

【问题讨论】:

    标签: wpf canvas wpf-positioning


    【解决方案1】:

    我遇到了这篇文章,因为我正在寻找一种仅在 XAML 中将 Canvas 中的元素居中的方法,而不是使用附加属性。

    以防万一,你来也是出于同样的原因:

    <Canvas x:Name="myCanvas">
        <Grid Width="{Binding ActualWidth, ElementName=myCanvas}" 
              Height="{Binding ActualHeight, ElementName=myCanvas}">
            <Label Content="Hello World!"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center" 
            />
        </Grid>
    </Canvas>
    

    还有一件事

    请注意,这里的每个解决方案都是一个陷阱,具体取决于您尝试归档的内容。仅仅因为您的元素在分层顺序上位于 Canvas 内,它就不会成为 Canvas 本身的一部分。 Canvas 是用来绘制而不是放置控件的东西。所以你不能对这些控件使用Canvas API,因为Grid 显然就像一个孤立的覆盖。

    如果您想要一个单独的叠加层,而 Canvas 是您的背景,那么您最好使用这个解决方案。

    【讨论】:

    • 太棒了!这“按原样”工作,没有后面的代码。我用它来居中一个用户控件,代替标签。
    • 现在里面有一个慢网格。没有网格的解决方案会很好。
    • @MathiasMüller 没有什么可以阻止您使用任何其他控件来代替 Grid。
    • 拯救我的一天。我没有添加网格来处理布局。谢谢@MartinBraun
    【解决方案2】:

    您可以将 Canvas 和您想要居中的元素放在 Grid 中:

    <Grid>
        <Canvas Width="200" Height="200" Background="Black" />
        <Button Width="50" Height="20" > Hello
        </Button>
    </Grid>
    

    【讨论】:

      【解决方案3】:

      我知道的唯一方法是计算画布的大小,然后根据它设置属性。这可以使用画布上SizeChanged 的事件处理程序来完成:

      parentCanvas.SizeChanged += new SizeChangedEventHandler(parentCanvas_SizeChanged);
      
      void parentCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
      {
          parentCanvas.SetLeft(uiElement, (parentCanvas.ActualWidth - uiElement.ActualWidth) / 2);
          parentCanvas.SetTop(uiElement, (parentCanvas.ActualHeight - uiElement.ActualHeight) / 2);
      }
      

      【讨论】:

      • 在加载窗口时会触发此事件。
      • 应该,是的。只要画布的 ActualWidth/ActualHeight 属性发生更改,它就会触发。 (即在布局更新期间)
      • 太棒了。但我认为应该是 Canvas.SetLeft 和 Canvas.SetTop;不是父 Canvas 的实例。
      【解决方案4】:

      类似的东西。

      double left = (Canvas.ActualWidth - element.ActualWidth) / 2;
      Canvas.SetLeft(element, left);
      
      double top  = (Canvas.ActualHeight - element.ActualHeight) / 2;
      Canvas.SetTop(element, top);
      

      【讨论】:

      • 这可以写在一个继承画布类作为附加属性的类中。
      猜你喜欢
      • 2011-01-03
      • 2021-07-28
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多