2009-06-03 10 views
2

Dans ASP.NET je pouvais faire un contrôle utilisateur pour occuper plus d'une cellule dans un tableau sur la page:Grille WPF entre les contrôles utilisateur?

UserControl1:

<tr> 
    <td>foo</td> 
    <td>bar</td> 
</tr> 

Page1:

<table> 
    <put a UserControl1 here/> 
    <put another UserControl1 here/> 
</table> 

et la colonne Largeurs ajustées automatiquement pour s'adapter au plus grand contrôle de l'utilisateur.

Cela peut-il être fait aussi dans WPF? Comment ?

Je pense que les contrôles utilisateur ne peuvent pas faire cela, et je dois créer une classe simple au lieu d'un contrôle utilisateur, qui a une méthode pour tout ajouter à la grille. Mais de cette façon tout devrait être fait par code, xaml est inutile ici.

Répondre

6

J'ai trouvé la réponse here.

Cela peut être fait avec SharedSizeGroup et Grid.IsSharedSizeScope.

UserControl1.xaml:

<UserControl x:Class="WpfApplication1.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="SharedSizeGroup1"/> 
      <ColumnDefinition SharedSizeGroup="SharedSizeGroup2"/> 
     </Grid.ColumnDefinitions> 
     <Label Name="Label1" Grid.Column="0">Label1</Label> 
     <Label Name="Label2" Grid.Column="1">Label2</Label> 
    </Grid> 
</UserControl> 

Window1.xaml:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:y="clr-namespace:WpfApplication1"> 
    <Grid Grid.IsSharedSizeScope="True"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <y:UserControl1 Grid.Row="0" x:Name="UserControl1A"/> 
     <y:UserControl1 Grid.Row="1" x:Name="UserControl1B"/> 
    </Grid> 
</Window> 

Window1.xaml.cs:

using System.Windows; 

namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      UserControl1A.Label1.Content = "Label1WithLongText"; 
     } 
    } 
} 
+0

Pouvez-vous m'aider? s'il vous plaît voir mon commentaire à: http://stackoverflow.com/questions/4251183/wpf-two-dimensional-datagrid-listview/4254842#4254842 – Shimmy

1

Non, vous ne pouvez rien faire de tel dans XAML.

Les contrôles utilisateur ASP.NET émettent du code HTML. Votre contrôle utilisateur émet le code HTML pour une ligne de table. Étant donné que le balisage émis a un sens dans le balisage du formulaire, ce que vous faites est possible, mais pas très bon, puisque le contrôle dépend entièrement du balisage de la page pour avoir du sens. En outre, la taille et le placement du contrôle dans la page devraient être la responsabilité de la page, pas celle du contrôle. Tout est question d'encapsulation.

Les contrôles WPF n'émettent pas de balisage, bien sûr. Au contraire, ils sont instanciés dans la fenêtre/page WPF, et vivent comme des contrôles visuels dans la fenêtre. Une situation différente entièrement.

Pour rendre la durée de votre commande plusieurs colonnes, vous devez utiliser l'attribut d'extension Grid.ColumnSpan, comme ceci:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <MyControl Grid.ColumnSpan="2" Name="myControl">Button</Button> 
</Grid> 
0

je recommande de ne pas avoir le contrôle de l'utilisateur de définir la façon dont il devrait occuper les cellules de table/grille en un hôte. La page/fenêtre qui héberge le contrôle utilisateur doit définir comment le contrôle utilisateur doit être affiché. De cette façon, vous pouvez placer les contrôles utilisateur dans une grille WPF et utiliser l'attribut Grid.ColumnSpan pour que le contrôle utilisateur occupe plusieurs colonnes dans la grille.

Le contrôle finira par être beaucoup plus utilisable, et la séparation de la resonsabilité est conservée.

+0

Pouvez-vous donner un exemple de code de la façon dont vous obtenir la au dessus? – djskinner

Questions connexes