2010-11-22 30 views
8

Tôi đang sử dụng Lưới WPF làm bố cục cửa sổ của mình. Nó có hai cột và bất kỳ số hàng nào. Cột đầu tiên được sử dụng cụ thể cho nhãn và cột thứ hai được sử dụng cho các trường do người dùng nhập (ví dụ: TextBox, ComboBox, v.v.). Yêu cầu của tôi là:WPF TextBlock.TextTrimming Không hoạt động với ColumnDefinition tự động có kích thước

  1. Cột đầu tiên phải có chiều rộng tối thiểu là 50 và chiều rộng tối đa 180.
  2. Đầu tiên kích thước cột phải để nội dung của nó trừ khi nó bất chấp những yêu cầu đầu tiên.
  3. Cột thứ hai phải chiếm toàn bộ không gian còn lại.

Tôi đã thử các XAML dưới đây:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" MinWidth="50" MaxWidth="180" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Text="First Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Column="1" Text="{Binding FirstName}" /> 

    <TextBlock Grid.Row="1" Text="Family Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding FamilyName}" /> 

    <TextBlock Grid.Row="2" Text="Label That Won't Fit in 180 units" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Text}" /> 
</Grid> 

Tôi đã hy vọng rằng nhãn hàng thứ ba, "Nhãn Đó sẽ không phù hợp trong 180 đơn vị", sẽ được rút ngắn thành một cái gì đó như "Label Đó Won ... ". Thay vào đó, nó chỉ bị cắt bớt thành "Label That Won't" với một nửa số "t" bị thiếu.

Tôi đã thử một cách tiếp cận khác mà tôi tìm thấy trên web ở đâu đó.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="LabelColumn" Width="Auto" MinWidth="50" MaxWidth="180" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="First Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Column="1" Text="{Binding FirstName}" /> 

    <TextBlock Grid.Row="1" Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="Family Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding FamilyName}" /> 

    <TextBlock Grid.Row="2" Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="Label That Won't Fit in 180 units" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Text}" /> 
</Grid> 

Nó kết thúc làm việc trên Expression Blend (Đôi khi ...) nhưng không phải khi chạy ứng dụng. Khi chạy, tất cả các nhãn biến mất hoàn toàn. Tôi thấy qua cửa sổ xem rằng tất cả TextBlocks có Độ rộng thực tế là 0 trong khi LabelColumn.ActualWidth bằng 80.

Có các tùy chọn nào khác không?

Trả lời

7

Bạn cần có MinWidthMaxWidth đặt trên TextBlock, vì thiết lập MinWidthMaxWidth về định nghĩa cột không phải lúc nào cũng được vinh danh khi hiển thị. Sử dụng ActualWidth trong biểu thức ràng buộc có thể có vấn đề vì ActualWidth được đặt trong nhiều lần hiển thị và có thể cho kết quả không thể đoán trước

Các vấn đề liên quan