it-swarm-vi.tech

Văn bản trên ProgressBar trong WPF

Điều này có thể là không có trí tuệ đối với nhận thức WPF, nhưng tôi muốn biết liệu có cách nào đơn giản để đưa văn bản lên Tiến trình WPF không. Đối với tôi, một thanh tiến trình trống trông trần trụi. Đó là màn hình bất động sản có thể mang thông điệp về những gì đang được tiến hành, hoặc thậm chí chỉ cần thêm số vào đại diện. Bây giờ, WPF là tất cả về container và tiện ích mở rộng và tôi đang dần suy nghĩ về điều đó, nhưng vì tôi không thấy thuộc tính "Văn bản" hoặc "Nội dung", tôi nghĩ rằng tôi sẽ phải thêm một cái gì đó đến container đó là thanh tiến trình của tôi. Có một hoặc hai kỹ thuật nào đó tự nhiên hơn các xung WinForms ban đầu của tôi sẽ không? Cách tốt nhất, tự nhiên nhất của WPF để thêm văn bản vào thanh tiến trình đó là gì?

49
Jacob Proffitt

Nếu bạn cần có một phương thức có thể sử dụng lại để thêm văn bản, bạn có thể tạo Kiểu/Điều khiển mới có thêm TextBlock để hiển thị văn bản. Bạn có thể chiếm quyền điều khiển TextSearch.Text để đặt văn bản trên thanh tiến trình. 

Nếu không cần sử dụng lại, chỉ cần đặt thanh tiến trình vào Lưới và thêm TextBlock vào lưới. Vì WPF có thể kết hợp các yếu tố lại với nhau, điều này sẽ hoạt động tốt.

Nếu bạn muốn, bạn có thể tạo UserControl hiển thị ProgressBar và TextBlock dưới dạng các thuộc tính công khai, do đó sẽ ít hoạt động hơn so với tạo ControlTemplate tùy chỉnh.

28
Abe Heidebrecht

Cả hai phản hồi trước đó (tạo CustomControl mới hoặc Adorner) đều là các cách thực hành tốt hơn, nhưng nếu bạn chỉ muốn nhanh chóng và bẩn (hoặc để hiểu trực quan cách thực hiện) thì mã này sẽ hoạt động:

<Grid Width="300" Height="50">  
   <ProgressBar Value="50" />
   <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
      My Text
   </TextBlock>
</Grid>

Chỉ cần lưu ý rằng chỉ số z sao cho mục cuối cùng được liệt kê sẽ ở trên cùng.

Ngoài ra, nếu bạn chưa có Kaxaml , hãy chắc chắn chọn nó - thật tuyệt khi chơi với XAML khi bạn đang cố gắng tìm hiểu mọi thứ.

55
SmartyP

Điều này có thể rất đơn giản (trừ khi có rất nhiều cách để làm việc này).

Bạn có thể sử dụng Style để thực hiện việc này hoặc bạn chỉ cần phủ một TextBlockProgressBar

Cá nhân tôi sử dụng điều này để hiển thị phần trăm tiến độ khi chờ hoàn thành.

Để đơn giản, tôi chỉ muốn có mộtBinding mà thôi, vì vậy tôi đã đính kèm TextBock.Text vào ProgressBar.Value.

Sau đó, chỉ cần sao chép Mã để hoàn thành nó.

<Grid>
   <ProgressBar Minimum="0" 
                Maximum="100" 
                Value="{Binding InsertBindingHere}" 
                Name="pbStatus" />
   <TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" />
</Grid>

Đây là cách nó có thể trông như thế nào:

 enter image description here

Kiểm tra Hướng dẫn WPF cho toàn bộ bài. 

27
Felix D.

Bạn có thể sử dụng một góc để hiển thị văn bản trên đầu trang.

Xem Bài viết MSDN về Người tô điểm

Bạn sẽ tạo một lớp kế thừa từ lớp Adorner. Ghi đè phương thức OnRender để vẽ văn bản mà bạn muốn. Nếu bạn muốn, bạn có thể tạo một thuộc tính phụ thuộc cho Góc tùy chỉnh của bạn có chứa văn bản mà bạn muốn hiển thị. Sau đó, sử dụng ví dụ trong liên kết mà tôi đã đề cập để thêm Góc này vào lớp góc của thanh tiến trình của bạn.

5
Bob Wintemberg

Nhấp chuột phải ProgressBar và nhấp vào Chỉnh sửa Mẫu> Chỉnh sửa Bản sao.

Sau đó, đặt TextBlock như hiển thị bên dưới ngay phía trên thẻ đóng của Grid trong Kiểu được tạo bởi VS.

   <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
   <TextBlock Background="Transparent" Text="work in progress" Foreground="Black" TextAlignment="Center"/>
 </Grid>
 <ControlTemplate.Triggers>
1
AnjumSKhan

ProgressBar với Văn bản và Liên kết từ 2 Thuộc tính (Giá trị/Giá trị tối đa):

<Grid>
    <ProgressBar Name="pbUsrLvl"
                 Minimum="1" 
                 Maximum="99" 
                 Value="59" 
                 Margin="5"  
                 Height="24"  Foreground="#FF62FF7F"/>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock.Text>
            <MultiBinding StringFormat="{}UserLvl:{0}/{1}">
                <Binding Path="Value" ElementName="pbUsrLvl" />
                <Binding Path="Maximum" ElementName="pbUsrLvl" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Grid>

Rezult:

 enter image description here


Tương tự nhưng với% tiến trình:

<Grid>
    <ProgressBar Name="pbLifePassed"
                 Minimum="0" 
                 Value="59" 
                 Maximum="100"
                 Margin="5" Height="24" Foreground="#FF62FF7F"/>
    <TextBlock Text="{Binding ElementName=pbLifePassed, Path=Value, StringFormat={}{0:0}%}" 
           HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

 enter image description here

0
Andrew