2010-01-11 4 views
0

J'ai trouvé cette ressource Centering On Canvas. Mais le problème est que je ne peux pas utiliser la même chose via C# car les valeurs canvas left et top retournent zéro et lancent une exception. Je ne placerai pas toujours d'éléments sur canvas via xaml, alors comment utiliser C# pour l'implémenter. S'il vous plaît aider.WPF Centrage d'éléments sur toile par code

<Canvas.Left> 
<MultiBinding Converter="{StaticResource MidValue}" 
       ConverterParameter="1"> 
    <Binding ElementName="cnvMain2" 
      Path="ActualWidth" /> 
    <Binding ElementName="tbSize2" 
      Path="ActualWidth" /> 
</MultiBinding> 
</Canvas.Left> 
<Canvas.Top> 
<MultiBinding Converter="{StaticResource MidValue}" 
       ConverterParameter="7"> 
    <Binding ElementName="cnvMain2" 
      Path="ActualHeight" /> 
    <Binding ElementName="tbSize2" 
      Path="ActualHeight" /> 
</MultiBinding> 
</Canvas.Top> 
+1

S'il vous plaît poster XAML significative avec tous visés éléments et ressources en place ou même mieux dépouillé par exemple de ce que vous essayez d'atteindre. –

+0

Je vais seconder Stanislav. Qu'est-ce qui essaie de centrer où? – arconaut

+0

J'essaie de centrer un rectangle dans ce cas (n'importe quel objet). –

Répondre

0

Bien que le poste est assez vieux que je viens de faire usage du code ci-dessus et je voulais partager ma solution au cas où quelqu'un d'autre a besoin il:

public MainWindow() 
{ 
    InitializeComponent(); 

    this.SizeChanged += new SizeChangedEventHandler(MainWindow_SizeChanged); 
} 

void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var midValueConverter = new MidValueConverter(); 

    double left = (double)midValueConverter.Convert(new object[] { cnvMain2.ActualWidth, tbSize2.ActualWidth }, typeof(double), null, Thread.CurrentThread.CurrentCulture); 
    Canvas.SetLeft(tbSize2, left); 

    double top = (double)midValueConverter.Convert(new object[] { cnvMain2.ActualHeight, tbSize2.ActualHeight }, typeof(double), null, Thread.CurrentThread.CurrentCulture); 
    Canvas.SetTop(tbSize2, top); 

}