2012-02-01 8 views
12

z następującego kodu spodziewałem się zakończyć w dwa pola listy z taką samą szerokość jak są one na dwa columndefinition z Z = „*”Dlaczego dwie kolumny w siatce WPF z * nie mają tego samego rozmiaru?

Zamiast tego wygląda wielkość określa się na podstawie wielkości tekstu do góry ListBox, który nie ma sensu, ponieważ ten tekst jest znacznie mniejszy niż ListBox, a więc TextBlock ma wystarczająco dużo miejsca, aby pomieścić tekst.

<Window x:Class="UnderstandSizing.Window5" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window5" 
SizeToContent="WidthAndHeight" 
ResizeMode="NoResize" > 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" /> 
    <TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" /> 
    <ListBox Grid.Row="1" Grid.Column="0" Height="150" /> 

    <ListBox Grid.Row="1" Grid.Column="2" Height="150" /> 
    <TextBlock Grid.Row="2" Grid.ColumnSpan="3" Text="This textblock sets the max width" Width="300" /> 
</Grid> 
</Window> 

enter image description here

Funkcja automatycznego zaklejania WPF doprowadza mnie do szału ... jakieś pomysły? Dzięki.

EDYCJA: Wszystko wykonane w VS2008, na wszelki wypadek.

Odpowiedz

4

Alex. Znalazłem dokładną przyczynę tego, co się dzieje, i znalazłem rozwiązanie szczęśliwego uderzenia. Po prostu zmieniając * na 0, uzyskuję oczekiwany wynik (dziwne, jeśli mnie pytasz):

<Window x:Class="UnderstandSizing.Window5" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window5" 
SizeToContent="WidthAndHeight" 
ResizeMode="NoResize" > 

<Grid> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="0" /> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="0" /> 
</Grid.ColumnDefinitions> 
<Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
</Grid.RowDefinitions> 

<TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" /> 
<TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" /> 
<ListBox Grid.Row="1" Grid.Column="0" Height="150" /> 

<ListBox Grid.Row="1" Grid.Column="2" Height="150" /> 
<TextBlock Grid.Row="2" Grid.ColumnSpan="3" Text="This textblock sets the max width" Width="300" /> 
</Grid> 
</Window> 
3

Dla mnie to działa dobrze, w czasie wykonywania. Nie ufaj projektantom GUI, oni są wrogami.

0

Działa dla mnie w czasie projektowania i podczas pracy.

Projektant GUI nie powinien wyświetlać tych rozmiarów pikseli. Dla mnie pokazuje on 1*, co oznacza, że ​​zrzut ekranu pochodzi z kodu innego niż wklejony.

+0

Wcale. Od IDE do SO, bezpośrednio, bez zmian. Praca z VS2008. Może to ma znaczenie. –

+0

@SoMoS dziwne. Użyłem dokładnie tego samego kodu. Nic więcej w oknie, a nawet w projekcie. Wersja .NET? Używałem 4.0 i VS2010 – Ray

+0

Pewnie, że tak. Używam NET 3.5 i VS2008 –

11

Spójrz na to:

http://www.wpftutorial.net/GridLayout.html

„Star (*):

Staje się tak dużo miejsca jak dostępne (po wypełnieniu wszystkich auto i stałej wielkości kolumn), proporcjonalnie podzielona przez cały Star- Więc 3 */5 * oznacza to samo co 30 */50 *. Pamiętaj, że rozmiar gwiazdki nie działa, jeśli rozmiar siatki jest obliczany na podstawie jego zawartości "

Co to jest cas e w twoim kodzie. Podejrzewam, że to również jest powód, dla którego testowanie go wyglądało dobrze, jeśli wkleili Grid do okna większego niż 300 pikseli ustawionych przez twój TextBlock. Mam taki sam problem, jaki robię, jeśli używam dokładnie tego samego XAML.

Edytuj: To jest "dlaczego". Zobacz to pytanie, aby uzyskać możliwe alternatywne rozwiązanie: Wpf: Grid: How can i share column/row height width?

Ostatnia odpowiedź (nie wybrana przez pytającego) wydaje się najbardziej użyteczna w tym przypadku.

+0

Miałem dokładnie ten sam kod w oknie na jego własny i nie mógł się rozmnażać. Jednak przy użyciu VS2010 i .NET 4.0. – Ray

+0

Nieparzysty. Używam tego samego i zostało ono odtworzone, z wyjątkiem tego, że szerokości kolumn zostały oznaczone jako 1 * zgodnie z oczekiwaniami. Ale rzeczywiste szerokości wynosiły 167 i 133. –

+0

Znalazłem naprawdę dziwne rozwiązanie.Jeśli zmienię * na 0, otrzymam pożądaną funkcję: \ –

Powiązane problemy