2013-05-03 6 views
5

Chaque fois que j'essaie de créer une fenêtre et que je mets le SizeToContent à WidthAndHeight, à l'ouverture de la fenêtre correspond correctement à son contenu, mais il ajoute une petite bordure à droite et en bas. Lors du redimensionnement, cela disparaît et lorsque vous utilisez une hauteur et une largeur définies, ce problème ne se produit pas non plus.SizeToContent peint une bordure indésirable

Ceci est un exemple de ce que je veux dire:

enter image description here

On pourrait dire que ce n'est pas un énorme problème, mais je trouve cela fait ma demande un aspect peu professionnel, surtout quand je dois présenter cela. Est-ce que quelqu'un sait pourquoi cela se produit, ou s'il y a une solution de contournement? Je code ce projet en C#.

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

Les valeurs sont transmises à la création de la classe.

Toutefois, je rencontre ce problème sur toutes les fenêtres que j'ai créées, même sans code sous-jacent personnalisé.

+0

Peut-on voir le Xaml? –

+0

Montrez-nous le code que vous avez pour l'événement ouvert, et il peut-être un problème là-bas –

+0

Xaml vient d'ajouter – Kryptoxx

Répondre

2

En utilisant this tool (il est bon, d'ailleurs) je trouve que le contrôle Border du Window (son enfant immédiat) ne remplit pas toute la fenêtre, laissant cette "frontière", qui est en fait l'arrière-plan du contrôle Window.

J'ai trouvé une solution de contournement. Width et Height du Border sont NaN. Si vous définissez ces valeurs sur une valeur entière, la "bordure" disparaît.

Utilisons les valeurs de ActualWidth et ActualHeight, mais arrondies à un nombre entier.

Définir le convertisseur:

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 (souvenez-vous d'inclure votre espace de noms, dans ce cas, "c")

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

Ensuite, créez un style de reliure de la taille de la taille réelle en utilisant le convertisseur. Il est important d'utiliser une clé, donc il ne sera pas applicable à tous les Border (la plupart des contrôles utilisent):

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

Enfin, appliquer ce style au premier enfant de la fenêtre (le contrôle Border):

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

Si quelqu'un peut le faire d'une manière plus simple, s'il vous plaît partager aussi.

0

Bon, voici une réponse connexe dans laquelle vous pouvez vous référer à une bonne réponse.

Automatic resizing when border content has changed

Donc, fondamentalement, vous voulez ajouter quelque chose comme ça, mais le mettre aux valeurs que vous souhaitez:

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

Merci pour cela, en ajoutant cela supprime la bordure sur la bonne taille, mais pas celle sur le fond. Cependant, ce n'est pas un gros problème pour moi, car cela ne semble pas trop mal. Cette réponse rapide est très appréciée! – Kryptoxx

+0

Aucun problème, heureux d'être utile :) –

4

<Window UseLayoutRounding="True" /> fonctionne pour moi.

+2

Bien que cet exemple de code puisse éventuellement répondre à la question, il serait préférable d'inclure une explication essentielle à votre réponse. À l'heure actuelle, cette réponse ajoute peu ou pas de valeur pour les futurs lecteurs. –

+0

@Gabriel utilise l'arrondi pour une seule bordure, UseLayoutRounding arrondira toute la fenêtre. – smg

1

réussi à le résoudre, par combinant réponses Gabriel et SMG. Lors du chargement de la fenêtre, obtenez la bordure en question et définissez sa propriété LayoutRounding sur true.

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