自动调整WPF控件

时间:2010-09-18 18:36:56

标签: .net wpf

我创建了以下WPF控件的点和描述标签:* North Star

<UserControl x:Class="StopPoint.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Canvas>
        <Path Fill="SkyBlue" Stroke="Black" StrokeThickness="2">
            <Path.Data>
                <EllipseGeometry Center="10, 10" RadiusX="4" RadiusY="4"/>
            </Path.Data>
        </Path>
        <TextBlock Text="North Star" Canvas.Left="20" Canvas.Top="20"/>
    </Canvas>
</UserControl>

我将在面板中有很多明星。我可以自动调整尽可能小的控件吗?

点赞:<Window SizeToContent="WidthAndHeight">...</Window>

3 个答案:

答案 0 :(得分:1)

如何将它包装在简单的堆叠面板中呢?

<UserControl x:Class="StopPoint.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

    <StackPanel Orientation="Horizontal">
        <Ellipse Margin="4" Stroke="Black" Fill="Yellow" Height="10" Width="10"/>
        <TextBlock Text="North Star">
            <TextBlock.RenderTransform>
                <RotateTransform Angle="45"/>
            </TextBlock.RenderTransform>
         </TextBlock>
    </StackPanel>
</UserControl>

答案 1 :(得分:1)

d:DesignHeight / Width属性仅在设计器中受到尊重,即Blend或Visual Studio(Cider)设计者。您可以安全地删除它们,然后您将在设计器中看到您没有任何约束的控件。

您描述的自动调整大小行为是许多容器控件的默认行为。尽量不要像Holstebroe建议的那样使用Canvas。同时尝试研究变换 - 您可以应用旋转和平移变换来实现您描述的效果。

答案 2 :(得分:0)

您必须在usercontrol中创建自动调整大小的行为。

WPF方式是让父母向孩子们询问他们需要多少空间(测量阶段),然后根据可用空间告诉他们他们实际获得了多少空间(安排阶段)。

在这里,您希望父级的大小由子级所需的空间决定。因此将顶级父级(Canvas / UserControl)的大小绑定到内容所需的空间 - 使用IMultiValueConverter获取多个输入以进行求和。请参阅我发布的关于创建用户控件以获取形状中心文本的链接,这是上述示例。
一旦你有了这个,你也可以使用Viewbox进行“适合屏幕”。

        <!-- 36 <= 20  (canvas.top) + 16 (textblock.actualheight) -->
        <!--75 <= 20 (canvas.left) + 55 (textblock.actualwidth)-->
        <Canvas Background="SkyBlue" Height="36" Width="75">
        <TextBlock Canvas.Left="25" Text="{Binding ElementName=label, Path=ActualHeight}"/>
        <Path x:Name="dot" Fill="SkyBlue" Stroke="Black" StrokeThickness="2">
                <Path.Data>
                    <EllipseGeometry Center="10, 10" RadiusX="4" RadiusY="4"/>
                </Path.Data>
            </Path>

        <TextBlock x:Name="label" Text="North Star" Canvas.Left="20" Canvas.Top="20"/>