WPF自定义控件大小覆盖

时间:2010-11-02 21:29:35

标签: wpf controls size

我正在创建一个源自Grid的自定义WPF控件。 这是一个国际象棋棋盘,所以我希望它的宽度与它的高度相同。 我怎么能做到这一点?

编辑:

我尝试了以下内容。

private void cbcBoard_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.NewSize.Width != e.NewSize.Height)
        {
            double m = Math.Min(e.NewSize.Width, e.NewSize.Height);

            cbcBoard.Width = m;
            cbcBoard.Height = m;
        }
    }

它不起作用。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

新解决方案/解决方法。 UserControl可以保持原样,我们将缩放到父容器。

我们不能仅使用UserControl来实现Min(宽度,高度),因为如果我们为它设置了Height,那么父容器将不会将其缩放到Verticaly,而Width也是如此。如果我们试图将它们放在那里,那么有些情况下我们会以无限的宽度/高度调整大小循环结束。

我们需要的是在同一空间中完全填充它的另一个隐藏控件,并且可以告诉我们每次更改时它的宽度和高度是多少。然后我们可以使用Math.Min(宽度,高度)解决方案。像这样的东西。注意两个控件是如何在Grid.Row =“1”和Grid.Column =“1”。

<Rectangle Name="availableSpace"
           SizeChanged="availableSpace_SizeChanged"
           Fill="Transparent"
           Grid.Row="1"
           Grid.Column="1"/>
<myLib:UserControl1 x:Name="userControl11"
                    Grid.Row="1"
                    Grid.Column="1"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top"/>

然后在availableSpace_SizeChanged EventHandler

private void availableSpace_SizeChanged(object sender, SizeChangedEventArgs e)
{
    double minValue = Math.Min(availableSpace.ActualWidth, availableSpace.ActualHeight);
    userControl1.Width = minValue;
    userControl1.Height = minValue;
}

现在我们有1:1的UserControl比例,它将垂直和水平缩放

答案 1 :(得分:1)

我认为最简单的解决方案是将UserControl的大小设置为Height == Width的某个常量值,然后将整个内容放入Viewbox这将为您处理缩放(同时保持宽高比)。

<Viewbox>
    <myLib:UserControl1 x:Name="userControl11" />
</Viewbox>

这意味着您的控件将被“拉伸”而不是调整大小,这可能会使它不适合您,但它很容易实现!