SizeToContent绘制不需要的边框

时间:2013-05-03 10:13:25

标签: c# wpf sizetocontent

每当我尝试制作一个窗口并将SizeToContent设置为WidthAndHeight时,在打开窗口时正确调整其大小的内容,但它会在右侧和底部添加一个小边框。在调整大小时,它会消失,当使用设置的高度和宽度时,也不会出现此问题。

这是我的意思的样本:

enter image description here

你可以说这不是一个大问题,虽然我发现它使我的应用程序看起来不专业,特别是当我需要提出这个时。有谁知道为什么会这样,或者是否有解决方法?我正在用C#编写这个项目。

XAML代码:

<Window x:Class="FPricing.InputDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="InputDialog" Width="400" Height="300" SizeToContent="WidthAndHeight">
    <StackPanel>
        <Label x:Name="question">?</Label>
        <TextBox x:Name="response"></TextBox>
        <Button Content="OK" IsDefault="True" Click="Button_Click" />
    </StackPanel>
</Window>

在创建类时传递值。

但是,即使没有自定义底层代码,我也会在我创建的每个窗口上遇到此问题。

4 个答案:

答案 0 :(得分:5)

<Window UseLayoutRounding="True" />适合我。

答案 1 :(得分:2)

使用this tool(这很好,顺便说一句)我发现Border(它的直接孩子)的Window控制不会填满整个窗口,留下那个“边界” ,实际上是Window控件的背景。

我找到了解决方法。 Width的{​​{1}}和HeightBorder。如果将它们设置为整数值,“边框”将消失。

我们使用NaNActualWidth的值,但舍入为整数。

定义转换器:

C#

ActualHeight

XAML(记住要包含你的命名空间,在本例中为“c”)

[ValueConversion(typeof(double), typeof(double))]
public class RoundConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return Math.Ceiling((double)value);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return value;
    }
}

然后使用转换器创建一个将大小绑定到实际大小的样式。使用密钥非常重要,因此它不适用于每个<c:RoundConverter x:Key="RoundConverter"/> (大多数控件使用它):

Border

最后,将此样式应用于窗口的第一个子项(<Style TargetType="{x:Type Border}" x:Key="WindowBorder"> <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth, Converter={StaticResource RoundConverter}}"/> <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight, Converter={StaticResource RoundConverter}}"/> </Style> 控件):

Border

如果有人能够以更简单的方式做到这一点,请分享。

答案 2 :(得分:1)

通过结合 Gabriel和smg答案设法解决了这个问题。 加载窗口后,获取有问题的边框,并将其LayoutRounding设置为true。

this.Loaded += (sender, args) =>           
{
    var border = this.GetVisualChild(0) as Border;
    if (border != null)
        border.UseLayoutRounding = true;
};

答案 3 :(得分:0)

好的,这是一个相关的答案,你可以参考一个很好的答案。

Automatic resizing when border content has changed

所以基本上你想添加这样的东西,但是把它放到你想要的值上:

<Border x:Name="border"
            BorderBrush="Cornsilk"
            BorderThickness="1">
        <Ellipse Width="40"
                 Height="20"
                 Fill="AliceBlue"
                 Stroke="Black" />
    </Border>