| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

im Weihnachtsendspurt noch eine WPF - Frage:

Für Dialoge benötige ich mehrere UserControls. Ich wollte diese zuerst nach folgendem Schema zusammensetzen:

Label: Eingabefeld(er)


In dem eigentlichen Dialog sollen dann mehrere UserControls erscheinen, die - jetzt kommts - alle zueinander ausgerichtet sind:

Abc:    TextBox
Abc123: TextBox
Foo2: ComboBox
c2: Slider Textbox


Irgendwie stehe ich da gerade auf dem Schlauch. Für die Grundformatierung der "Tabelle" würde sich das Grid anbieten, so dass die Spalte mit den Labels sich nach dem breitesten Label ausrichten kann. Aber das UserControl benötigt ja schon ein eigenes Panel ... ???

Oder bin ich da komplett auf dem Holzweg und ich muss die Labels aus dem UserControl rausnehmen? Dann hätte ich wieder alle Freiräume der Positionierung:

Label A: UserControl A


Danke,
Mike
News:
19.12.2012
Xantiva 2,3k 2 9
3 Antworten
2
Kannst Du nicht einfach die Spaltenbreiten syncen?
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="C"/>

</Grid.ColumnDefinitions>
...
20.12.2012
KCT 937 1 8
+1, ich habs nicht ausprobiert, aber was die Doku drüber sagt, scheint das des Rätsels Lösung. Kannte ich noch gar nicht. Sehr nützlich, wieder was gelernt. Danke dafür.
ffordermaier 20.12.2012
Gern geschehen. Hatte damals auch lange gesucht.
KCT 02.01.2013
Hat leider etwas gedauert, bis das ich es austesten konnte. Das ist die perfekte Lösung! Danke.
Xantiva 16.01.2013
1
Die Labels rauszunehmen, wäre eine Möglichkeit.

Du könntest aber Deinem Basis-UserControl auch eine DependencyProperty spendieren, die die Breite der Spalte für das Label im UserControl angibt. Diese Property könntest Du dann an die Breite der Spalte des Grids binden, das alle diese UserControls enthält. Im User Control selbst verwendets Du die DependencyProperty, um die Breite des Labels festzulegen.

Spontan fällt mir nichts weiter ein, aber ich denk noch ein bisschen drüber nach...
19.12.2012
ffordermaier 8,4k 3 9
Ok, dann habe ich aber doch noch nicht die Rückkopplung, wie breit das breiteste Label ist?
Aber sonst nehme ich die Labels raus. Wie war das noch? KISS? :D Danke!
Xantiva 19.12.2012
Hast Recht, da war wohl ein Denkfehler. So ist das mit Spontaneinfällen...
ffordermaier 19.12.2012
Spontane Einfälle können manchmal richtig gut sein ;)
Trotzdem Danke!
Xantiva 19.12.2012
0
irdendwie klingt das für mich eher nach nen ItemsControl und einer Liste im VM...

Aber zur eigentlichen Frage: ich glaube automatisch anpassen ist rein im XAML nicht so einfach möglich. Du kannst aber in deinen Untercontrols auf deine Columns des HauptControls Grids verweisen und die Grössen setzen:

Haupt
<Grid Width="300" Background="AliceBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="50" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Controls:UserControl1 x:Name="userControl1"
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2" />
<Controls:UserControl2 x:Name="userControl2"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2" />
</Grid>


UserControl1:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[0].Width}" />
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[1].Width}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">1. Kurz:</Label>
<TextBox Grid.Row="0" Grid.Column="1" />

<Label Grid.Row="1" Grid.Column="0">1. Lange 1234:</Label>
<TextBox Grid.Row="1" Grid.Column="1" />

<Label Grid.Row="2" Grid.Column="0">1. 1234:</Label>
<TextBox Grid.Row="2" Grid.Column="1" />

<Label Grid.Row="3" Grid.Column="0">1. Lang 1234:</Label>
<TextBox Grid.Row="3" Grid.Column="1" />

<Label Grid.Row="4" Grid.Column="0">1. B:</Label>
<TextBox Grid.Row="4" Grid.Column="1" />
</Grid>


UserControl2:
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[0].Width}" />
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[1].Width}" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">2. Kurz:</Label>
<TextBox Grid.Row="0" Grid.Column="1" />

<Label Grid.Row="1" Grid.Column="0">2. Lange 1234:</Label>
<TextBox Grid.Row="1" Grid.Column="1" />

<Label Grid.Row="2" Grid.Column="0">2. Länger 1234:</Label>
<TextBox Grid.Row="2" Grid.Column="1" />

<Label Grid.Row="3" Grid.Column="0">2. Ganz Lang 1234:</Label>
<TextBox Grid.Row="3" Grid.Column="1" />

<Label Grid.Row="4" Grid.Column="0">2. B:</Label>
<TextBox Grid.Row="4" Grid.Column="1" />
</Grid>


Hierbei brauchst du "nur" noch im Haupt Grid die Column Width anpassen und es wird automatisch nachgezogen.

Vielleicht hilft dir das ja ein wenig weiter.

lg
20.12.2012
wuliwux 133 5

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH