2010-11-07 41 views
8

Tôi đang gặp rất nhiều vấn đề với cách Silverlight để xử lý bố cục. Chủ yếu là, tôi không thể tìm thấy một cách để dự đoán kích thước bị chiếm bởi chuỗi trước khi chúng thực sự được rút ra. Trên iPhone, chúng tôi có một số phương pháp rất đơn giản cho phép chúng tôi xác định kích thước chuỗi sẽ chiếm trên màn hình dựa trên kích thước phông chữ, tùy chọn gói từ và chiều rộng và/hoặc chiều cao có sẵn. Nhưng với Silverlight, tôi không thể tìm ra cách để có kết quả nhất quán trên ứng dụng của mình.Silverlight: Cách dự đoán kích thước chuỗi?

Tôi hiện đang sử dụng ActuelHeight và ActualWidth của một phiên bản TextBlock nhưng nó mang lại cho tôi kết quả ngẫu nhiên. Ví dụ: tôi sử dụng mã sau ...

TextBlock proto = new TextBlock(); 

proto.Width = 456; 
proto.TextWrapping = TextWrapping.Wrap; 
proto.Text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
double h = proto.ActualHeight; 

... h được đặt thành 66 pixel! Như bạn có thể đoán một mình, không có cách nào văn bản dài như vậy có thể vừa với hình chữ nhật rộng 456 pixel và cao 66 pixel. Và nó được xác nhận khi tôi thêm khối văn bản bên trong canvas, thiết lập kích thước của nó thành {456; 66} và kiểm tra ứng dụng: văn bản không vừa với khối văn bản!

Ai đó có thể giải thích cho tôi vấn đề nằm ở đâu và chỉ cho tôi cách nhất quán (và đáng tin cậy) để đo kích thước chuỗi?

Cảm ơn trước,

Eric.

+0

Khi bạn thiết lập di chuyển tự động, bạn sẽ có thể xem tất cả các văn bản bằng cách di chuyển, vậy tại sao bạn muốn biết kích thước trong pixel? –

Trả lời

12

Bạn có thể yêu cầu TextBlock để đo lường chính nó (mà không có nó chưa được hiển thị) bằng cách gọi phương pháp Measure của nó:

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
var width = textBlock.DesiredSize.Width; 
var height = textBlock.DesiredSize.Height; 

Tất nhiên, nó có thể không có chiều rộng vô hạn và chiều cao, vì vậy tùy thuộc vào trường hợp sử dụng của bạn bạn có thể muốn yêu cầu yếu tố gốc của bạn để đo lường chính nó, mà sẽ lần lượt đo tất cả trẻ em (bao gồm cả TextBlock).

+1

Cảm ơn, nhưng nó không hoạt động. Tôi cho rằng TextBlock cần được hiển thị cho phương pháp đo lường để làm việc ... –

+0

@EOR MORAND ** Gợi ý **: hiển thị, để đo, không có nghĩa là hiển thị trên màn hình –

+1

Đối với tôi chỉ textBlock.ActualHeight và textBlock. ActualWidth đã làm việc. DesiredSize số không trả về. –

1

TextBlock sẽ không thay đổi kích thước cho đến khi nó thực sự được hiển thị ...

Đối với phần còn lại, tôi nghĩ đây là vấn đề thiết kế. Trong môi trường XAML, bạn không cần phải biết/đặt pixelizes rất thường xuyên.

+0

Nếu TextBlock không thay đổi kích cỡ cho đến khi nó được hiển thị thực sự, làm thế nào tôi có thể cung cấp chiều cao cho các mẫu hộp danh sách của tôi? Tài liệu nói rằng chúng ta nên cung cấp các mẫu có chiều cao cố định trước khi chúng thực sự được hiển thị, nhưng dường như không có cách nào để tính toán chiều cao của mẫu cho đến khi nó được hiển thị thực sự. –

3

Nếu có thể, hãy thử và tạo một thiết kế mà bạn không cần biết kích thước vật lý của một khối chữ. Sử dụng thiết kế cuộn và thay đổi kích thước động để tránh cần phải biết điều này.

Tuy nhiên, nếu bạn thực sự phải biết điều này, bạn có thể thử mẹo này từ màn hình nền (nơi không thể sử dụng MeasureText - xin lỗi không được hỗ trợ trong Silverlight). Thêm textblock vào UI nhưng ngoài vùng hiển thị hoặc phía sau một điều khiển khác. Sau đó, bạn có thể nhận được kích thước được hiển thị thực tế.

1

Cảm ơn các bạn đã giúp đỡ, thực sự phương pháp đầu tiên của tôi đã hoạt động! Nhưng tôi đã quên đặt fontSize trước khi truy xuất ActualHeight - và nó được thiết lập tự động bởi cha mẹ khi được thêm vào cây thị giác! Vì vậy, 66 pixel thực sự là chiều cao phù hợp của khối văn bản của tôi với kích thước phông chữ nhỏ được sử dụng theo mặc định bởi khối văn bản. Sau khi được thêm vào cây thị giác, kích thước phông chữ của khối văn bản lớn hơn, dẫn đến việc cắt clip.

Một lần nữa, cảm ơn sự giúp đỡ của bạn!

-2

Giải pháp của tôi là sử dụng 3 hoặc nhiều TextBlocks:

string[] dataSeparator = new string[] { "\n" }; 
string[] data; 
data = longString.Split(dataSeparator, StringSplitOptions.None); 
TB1.Text = string.Empty; 
TB2.Text = string.Empty; 
TB3.Text = string.Empty; 
int length = data.Length/3; 
for (int i = 0; i < length; i++) 
{ 
    TB1.Text += data[i] + "\n"; 
} 
for (int i = length; i < length * 2; i++) 
{ 
    TB2.Text += data[i] + "\n"; 
} 
for (int i = length * 2; i < data.Length; i++) 
{ 
    TB3.Text += data[i] + "\n"; 
} 
Các vấn đề liên quan