每当我尝试制作一个窗口并将SizeToContent
设置为WidthAndHeight
时,在打开窗口时正确调整其大小的内容,但它会在右侧和底部添加一个小边框。在调整大小时,它会消失,当使用设置的高度和宽度时,也不会出现此问题。
这是我的意思的样本:
你可以说这不是一个大问题,虽然我发现它使我的应用程序看起来不专业,特别是当我需要提出这个时。有谁知道为什么会这样,或者是否有解决方法?我正在用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>
在创建类时传递值。
但是,即使没有自定义底层代码,我也会在我创建的每个窗口上遇到此问题。
答案 0 :(得分:5)
<Window UseLayoutRounding="True" />
适合我。
答案 1 :(得分:2)
使用this tool(这很好,顺便说一句)我发现Border
(它的直接孩子)的Window
控制不会填满整个窗口,留下那个“边界” ,实际上是Window
控件的背景。
我找到了解决方法。 Width
的{{1}}和Height
为Border
。如果将它们设置为整数值,“边框”将消失。
我们使用NaN
和ActualWidth
的值,但舍入为整数。
定义转换器:
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>