Tôi có một ComboBox hiển thị văn bản có độ dài khác nhau. Đối với các văn bản không dài thì không có vấn đề gì. Đối với các văn bản dài hơn chiều rộng của ComboBox tôi muốn cắt văn bản và thêm "..." (dấu chấm lửng) ở cuối để hiển thị chúng đúng cách. Điểm mấu chốt là tôi không muốn thay đổi chiều rộng của ComboBox. Có ai biết cách để làm điều này không?Cách hiển thị văn bản quá dài trong WPF ComboBox
Trả lời
Sử dụng tùy chỉnh ItemTemplate
cho số ComboBox
, sử dụng số TextBlock
với thuộc tính TextTrimming
được đặt thành CharacterEllipsis
.
Ví dụ:
<ComboBox ItemsSource="..." SelectedValuePath="...">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding ...}"
TextTrimming="CharacterEllipsis" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Bạn có thể sử dụng TextTrimmingCharacterEllipsis
hoặc WordEllipsis
cho các textblocks trong combobox của mình.
Câu trả lời, như Ross nói, là để thực hiện một tùy chỉnh ItemTemplate
. Tuy nhiên, để làm cho nó hoạt động đúng, bạn cần phải thực hiện việc ràng buộc đúng cách.
Lưu ý về phương pháp này: Bạn không thể đặt cả số DisplayMemberPath
và ItemTemplate
, nó phải là một hoặc cái kia.
Vì vậy, đối với trường hợp tổng thể nơi thành viên hiển thị là mục (ví dụ như đối với một string), bạn có thể sử dụng ràng buộc không có tính liên kết với các DataContext
của mẫu:
<ComboBox ItemsSource="..." SelectedValuePath="...">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Hoặc, bạn có thể đặt nó theo phong cách.
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Đối với trường hợp bạn muốn liên kết với một tài sản cụ thể của đối tượng, tương tự như cách bạn sẽ sử dụng DisplayMemberPath
bất động sản, thay thế các ràng buộc với các ràng buộc mà bạn sẽ sử dụng để một tài sản trên các đối tượng đó bạn đang ràng buộc. Vì vậy, hãy thay thế dòng thứ tư trong ví dụ đầu tiên của tôi bằng một cái gì đó như thế này:
<TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" />
Ràng buộc là trong bối cảnh của một mục duy nhất thuộc loại được kết hợp với ComboBox của bạn. Để làm điều này rõ ràng hơn, bạn có thể làm như sau:
<DataTemplate DataType="{x:Type namespace:MyItemType}">
<!-- My DataTemplate stuff here -->
</DataTemplate>
này sẽ cung cấp cho bạn những gợi ý cho các thuộc tính trên đối tượng trong khi bạn đang viết mã bên trong DataTemplate
.
Ràng buộc tồn tại trên Combobox trước đây không hoạt động ở định dạng này – Prat
http://stackoverflow.com/questions/18825882/combobox-textwrap-binding – Prat