2013-05-03 19 views
5

Ogni volta che provo a creare una finestra e imposto lo SizeToContent su WidthAndHeight, aprendo le dimensioni della finestra correttamente al suo contenuto, ma aggiunge un piccolo bordo a destra e in basso. Il ridimensionamento scompare e, quando si utilizza un'altezza e una larghezza impostate, anche questo problema non si verifica.SizeToContent dipinge un bordo indesiderato

Questo è un esempio di ciò che intendo:

enter image description here

Si potrebbe dire che questo non è un problema enorme, anche se mi trovo rende la mia domanda un aspetto poco professionale, soprattutto quando ho bisogno di presentare questo. Qualcuno sa perché questo sta accadendo, o se c'è una soluzione alternativa? Sto codificando questo progetto in C#.

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

I valori vengono trasmessi sulla creazione della classe.

Tuttavia, ho riscontrato questo problema su ogni finestra che abbia mai creato, anche senza codice sottostante personalizzato.

+0

Possiamo vedere Xaml? –

+0

Mostraci il codice che hai per l'evento aperto, e forse c'è un problema lì dentro –

+0

Xaml ha appena aggiunto – Kryptoxx

risposta

2

Utilizzando this tool (è bene, btw) ho scoperto che il controllo Border del Window (è figlio immediato) non riempie l'intera finestra, lasciando quel "bordo", che in realtà è lo sfondo del controllo Window.

Ho trovato una soluzione alternativa. Width e Height di Border sono NaN. Se li imposti su un valore intero, il "bordo" scompare.

Utilizziamo i valori di ActualWidth e ActualHeight, ma arrotondato a un numero intero.

Definire il convertitore:

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 (ricordarsi di includere lo spazio dei nomi, in questo caso "c")

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

Poi creare uno stile vincolante la dimensione di la dimensione reale usando il convertitore. E 'importante utilizzare una chiave, in modo che non si applicherà a tutti i Border (maggior parte dei controlli lo usano):

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

Infine, applicare questo stile al primo figlio della finestra (il controllo Border):

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

Se qualcuno può farlo in un modo più semplice, si prega di condividere anche.

0

Ok, ecco una risposta correlata in cui è possibile fare riferimento a una grande risposta.

Automatic resizing when border content has changed

Quindi, in pratica si desidera aggiungere qualcosa di simile, ma metterlo ai valori che si desidera:

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

Grazie per questo, aggiungendo questo rimuove il bordo della giusta misura, ma non quello in basso. Tuttavia questo non è un grosso problema per me in quanto questo non sembra davvero troppo male. Questa rapida risposta è molto apprezzata! – Kryptoxx

+0

Nessun problema, felice di essere d'aiuto :) –

4

<Window UseLayoutRounding="True" /> funziona per me.

+2

Sebbene questo esempio di codice possa probabilmente rispondere alla domanda, sarebbe preferibile includere alcune spiegazioni essenziali alla risposta. Così com'è ora questa risposta aggiunge poco o nessun valore per i futuri lettori. –

+0

@Gabriel usa l'arrotondamento per un solo bordo, UseLayoutRounding arrotonda l'intera finestra. – smg

1

riuscito a risolverlo, da combinando Gabriel e risposte smg. Al momento del caricamento della finestra, ottenere il bordo in questione e impostare LayoutRounding su true.

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