6

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

这是我的意思的一个示例:

在此处输入图像描述

你可以说这不是一个大问题,尽管我发现它让我的应用程序看起来不专业,尤其是当我需要展示它的时候。有谁知道为什么会发生这种情况,或者是否有解决方法?我正在用 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

4 回答 4

11

<Window UseLayoutRounding="True" />为我工作。

于 2015-01-31T07:14:24.257 回答
2

使用这个工具(很好,顺便说一句)我发现(它是直接子级)的Border控件Window 并没有填满整个窗口,留下那个“边框”,这实际上是Window控件的背景。

我找到了解决方法。WidthHeight的。Border_ NaN如果将它们设置为整数值,“边框”就会消失。

让我们使用 和 的值ActualWidthActualHeight但四舍五入为整数。

定义转换器:

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;
    }
}

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

<c:RoundConverter x:Key="RoundConverter"/>

然后使用转换器创建将大小绑定到实际大小的样式。使用 Key 很重要,因此它不会应用于每个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控件):

private void Window_Loaded(object sender, RoutedEventArgs e) {
    GetVisualChild(0).SetValue(StyleProperty, Application.Current.Resources["WindowBorder"]);
}

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

于 2014-04-27T18:25:50.777 回答
2

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

this.Loaded += (sender, args) =>           
{
    var border = this.GetVisualChild(0) as Border;
    if (border != null)
        border.UseLayoutRounding = true;
};
于 2017-07-24T10:40:01.033 回答
0

好的,这是一个相关的答案,您可以在其中参考一个很好的答案。

边框内容更改时自动调整大小

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

<Border x:Name="border"
            BorderBrush="Cornsilk"
            BorderThickness="1">
        <Ellipse Width="40"
                 Height="20"
                 Fill="AliceBlue"
                 Stroke="Black" />
    </Border>
于 2013-05-03T10:20:53.233 回答