编译后的剪切控件(SizeToContent属性)

时间:2017-04-20 23:51:04

标签: wpf xaml

在编辑模式下,我的textBlocks显示为我想要的。但是当我运行代码时,textBlock4被裁剪了!我想知道为什么以及如何纠正这一点,谢谢。

XAML:

<Window x:Class="CuttedControlAfterCompilation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CuttedControlAfterCompilation"
        mc:Ignorable="d"
        Title="Cutted Control After Compilation" Height="350" Width="525">

    <Grid>
        <StackPanel Orientation="Horizontal" Margin="0,50">
            <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
            <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
            <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
            <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Width="73" FontSize="112" FontWeight="Bold" TextAlignment="Center"/>
        </StackPanel>
    </Grid>

</Window>

图片:

textBlock4 with its full width in edit mode

textBlock4 with its width trimmed after execution

4 个答案:

答案 0 :(得分:1)

如果您在窗口中添加WindowStyle="None",则不会再剪切文本块。见Window.WindowStyle Property。我相信原因是窗口边框使用了一些宽度

或者设置SizeToContent="WidthAndHeight",您将被设置。见Window.SizeToContent Property

所以代码是

<Window x:Class="CuttedControlAfterCompilation.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CuttedControlAfterCompilation"
    mc:Ignorable="d"
    Title="Cutted Control After Compilation"
    SizeToContent="WidthAndHeight">
<Grid>
    <StackPanel Orientation="Horizontal" Margin="0,50">
        <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
        <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
        <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
        <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Width="73" FontSize="112" FontWeight="Bold" TextAlignment="Center"/>
    </StackPanel>
</Grid>

答案 1 :(得分:1)

在某些情况下,我无法使用SizeToContent属性。但是经过几次操作之后,我现在理解并使用得更好了。

  • 故障
  

麻烦Grid

<Grid Margin="0,50">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="148*"/>
        <ColumnDefinition Width="148*"/>
        <ColumnDefinition Width="148*"/>
        <ColumnDefinition Width="75*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Grid.Column="1" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Grid.Column="2" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Grid.Column="3" FontSize="112" FontWeight="Bold" TextAlignment="Center"/>
</Grid>

Image : The SizeToContent property narrows the dimensions of the Grid.

  

麻烦StackPanel

<StackPanel Orientation="Horizontal" Margin="0,50">
    <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Width="148" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Width="75" FontSize="112" FontWeight="Bold" TextAlignment="Center"/>
</StackPanel>

Image : The SizeToContent property narrows the height of the StackPanel.

  • 更正
  

适用于网格

可能性1:指定Width的{​​{1}}和Height(不要将它们保留为自动。)。

Grid

可能性2:设置Pixel中行的值,以及每列的值。

<Grid Width="519" Height="221" Margin="0,50">

可能性3:指定每个 <Grid.RowDefinitions> <RowDefinition Height="221"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="148"/> <ColumnDefinition Width="148"/> <ColumnDefinition Width="148"/> <ColumnDefinition Width="75"/> </Grid.ColumnDefinitions> 的{​​{1}}和Width(不要将它们保留为自动。)。

Height

可能性4:将TextBlock <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" Width="148" Height="221" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Width="148" Height="221" Grid.Column="1" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Width="148" Height="221" Grid.Column="2" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Width="75" Height="221" Grid.Column="3" FontSize="112" FontWeight="Bold" TextAlignment="Center"/> 的值设置为MinWidthMinHeight(在本例中为自动){{1} }。

Width
  

适用于StackPanel

可能性1:指定Height的{​​{1}}(不要将其保留为自动。)

Grid

可能性2:指定每个<Grid Margin="0,50" MinWidth="519" MinHeight="221"> 的{​​{1}}(不要将其保留为自动。)。

Height

可能性3:将StackPanel的值设置为<StackPanel Height="221" Orientation="Horizontal" Margin="0,50"> 的{​​{1}}(在本例中为自动)。

Height
  • <强>结论

    当维度浮动(星形或自动)时,TextBlock属性似乎忽略控件中未使用的空格。这可以通过指定 <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" Width="148" Height="221" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" Width="148" Height="221" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" Width="148" Height="221" FontSize="48" FontWeight="Bold" TextAlignment="Center"/> <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" Width="75" Height="221" FontSize="112" FontWeight="Bold" TextAlignment="Center"/> 包含的控件的维度或其子控件的维度来解决。

    因此,要从问题中获取XAML代码,可以通过将MinHeight Height设置为319并将StackPanel属性设置为Window来更正。

    <StackPanel Orientation="Horizontal" Margin="0,50" MinHeight="221">
    

我非常感谢@PouyaAbadi的贡献。

答案 2 :(得分:0)

这是标准窗口问题。您依赖于计算出的宽度值,但它们会被 ThreeD 窗口边框大小混淆。 Pouya Abadi提到,你可以把窗户做得更宽,这对于这种情况来说是完美的。但这不是一个好的解决方案恕我直言。

WPF完全是关于布局。我使用 DockPanel 来使contol占用所有可用空间,或网格列(1 *,1 *,1 *,。75 *)大小。我不确定你将从中做出什么。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width=".75*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="textBlock1" Background="#FFDEE2E4" Text="1" FontSize="48" FontWeight="Bold" TextAlignment="Center"/>
    <TextBlock x:Name="textBlock2" Background="#FFC7CCD0" Text="2" FontSize="48" FontWeight="Bold" TextAlignment="Center" Grid.Column="1"/>
    <TextBlock x:Name="textBlock3" Background="#FFAEB5B9" Text="3" FontSize="48" FontWeight="Bold" TextAlignment="Center" Grid.Column="2"/>
    <TextBlock x:Name="textBlock4" Background="#FFB29AC5" Text="4" FontSize="112" FontWeight="Bold" TextAlignment="Center" Grid.Column="3"/>
</Grid>

我个人不喜欢标准窗口,我使用First Floor Software +我的窗口样式定制的ModernUI.WPF,它可以清除现代的疯狂,让我完全控制它的外观。

答案 3 :(得分:0)

为什么不直接增加窗口的宽度?

<Window ... Title="Cutted Control After Compilation" Height="350" Width="533">

如上所述,另一个选项是将窗口的SizeToContent属性设置为WidthAndHeight或仅Width

<Window ... SizeToContent="WidthAndHeight">

这应该是一个简单的解决方法。