2013-05-03 13 views
5

Ilekroć próbuję zrobić okno i ustawić SizeToContent na WidthAndHeight, po otwarciu okna poprawnie rozmiarów do jego zawartości, ale dodaje małe obramowanie na prawo i na dole. Podczas zmiany rozmiaru znika to, a przy użyciu ustawionej wysokości i szerokości ten problem również nie występuje.SizeToContent maluje niechcianą granicę

Jest to próbka tego, co mam na myśli:

enter image description here

Można powiedzieć, że to nie jest wielki problem, choć uważam, że to sprawia, że ​​moja aplikacja wyglądać nieprofesjonalnie, zwłaszcza gdy trzeba to przedstawić. Czy ktokolwiek wie, dlaczego tak się dzieje lub czy istnieje obejście? Koduję ten projekt w języku C#.

XAML Kod:

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

Wartości są przekazywane na utworzenie klasy.

Jednak ten problem występuje w każdym oknie, jakie kiedykolwiek stworzyłem, nawet bez niestandardowego kodu źródłowego.

+0

Czy możemy zobaczyć Xaml? –

+0

Pokaż nam kod, który masz na otwartym wydarzeniu, i być może jest to problem w tym miejscu. –

+0

Xaml właśnie dodał – Kryptoxx

Odpowiedz

2

Korzystanie this tool (to dobrze, btw) okazało się, że kontrola Border z Window (to dziecko bezpośrednio) nie wypełnia całego okna, pozostawiając tę ​​"granicę", która jest faktycznie tłem kontrolki Window.

Znalazłem obejście. Width i Height z BorderNaN. Jeśli ustawisz je na wartość całkowitą, "granica" zniknie.

Użyjmy wartości ActualWidth i ActualHeight, ale zaokrąglamy do liczby całkowitej.

Zdefiniuj Przelicznik:

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 (pamiętaj o podaniu nazw, w tym przypadku "c")

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

Następnie utworzyć styl wiązania wielkości do rzeczywisty rozmiar za pomocą konwertera. Ważne jest, aby używać klucza, tak że nie będzie stosować się do każdego Border (większość kontroluje go używać):

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

Wreszcie zastosować ten styl do pierwszego dziecka okna (kontrola Border):

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

Jeśli ktoś może to zrobić w prostszy sposób, udostępnij również.

0

Okej, heres pokrewną odpowiedź, w której możesz odnieść się do wielkiej odpowiedzi.

Automatic resizing when border content has changed

Więc w zasadzie chcesz dodać coś takiego, ale umieścić go do wartości, które chcesz:

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

Dziękuję za to, dodając to usuwa granicę w odpowiednim rozmiarze, ale nie tę na dole. Jednak nie jest to dla mnie duży problem, ponieważ nie wygląda to tak źle. Ta szybka reakcja jest bardzo doceniana! – Kryptoxx

+0

Nie ma problemu, cieszę się z pomocy :) –

4

<Window UseLayoutRounding="True" /> działa dla mnie.

+2

Podczas gdy ta próbka kodu może ewentualnie odpowiedzieć na pytanie, lepiej byłoby podać kilka istotnych wyjaśnień do twojej odpowiedzi. W obecnej wersji ta odpowiedź nie dodaje żadnej wartości dla przyszłych czytelników. –

+0

@Gabriel używać zaokrąglenia tylko dla jednej granicy, UseLayoutRounding zaokrągla całe okno. – smg

1

udało się go rozwiązać, przez łącząc Gabriel i smg odpowiedzi. Po załadowaniu okna, uzyskaj odpowiednią ramkę i ustaw jej właściwość LayoutRounding na true.

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