2013-05-03 3 views
5

Всякий раз, когда я пытаюсь сделать окно, я установил SizeToContent в WidthAndHeight, при правильном раскрытии окна до его содержимого, но он добавляет небольшую границу справа и внизу. При изменении размера это исчезает, и при использовании заданной высоты и ширины эта проблема также не возникает.SizeToContent рисует нежелательную границу

Это пример того, что я имею в виду:

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> 

значения передаются по созданию класса.

Однако я испытываю эту проблему в каждом окне, которое когда-либо создавал, даже без специального базового кода.

+0

Можем ли мы увидеть Xaml? –

+0

Покажите нам код для открытого события, и это может быть проблема там –

+0

Xaml только что добавил – Kryptoxx

ответ

2

Использование this tool (это хорошо, кстати), я обнаружил, что управление Border из Window (это немедленный ребенок) не заполняет все окно, оставляя эту «границу», которая на самом деле является фоном элемента управления Window.

Я нашел обходное решение. Width и Height от Border - NaN. Если вы установите их на целочисленное значение, «граница» исчезнет.

Давайте использовать значения ActualWidth и ActualHeight, но округлены до целого числа.

Определение нейтрализатор:

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: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):

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

Если кто-то может сделать это более простым способом, пожалуйста, поделитесь тоже.

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> 
+0

Благодарим вас за это, добавив, что это удаляет границу по правильному размеру, но не та, что находится внизу. Однако для меня это не большая проблема, поскольку на самом деле это не очень плохо. Этот быстрый ответ очень ценится! – Kryptoxx

+0

Без проблем, рад помочь ... –

4

<Window UseLayoutRounding="True" /> работает для меня.

+2

Хотя этот пример кода может ответить на вопрос, было бы предпочтительнее включить некоторые существенные объяснения в ваш ответ. В настоящее время этот ответ добавляет немного никакой ценности для будущих читателей. –

+0

@ Габриэль использует закругление только для одной границы, UseLayoutRounding будет округлять все окно. – smg

1

удалось решить, по сочетание Габриэль и smg ответы. При загрузке окна найдите соответствующую границу и установите для параметра LayoutRounding значение true.

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