it-swarm-tr.com

WPF'deki bir İlerleme Çubuğundaki Metin

Bu WPF cognoscenti için bir beyin fırtınası olmayabilir, ancak WPF ProgressBar'a metin koymanın basit bir yolu olup olmadığını bilmek isterim. Bana göre boş bir ilerleme çubuğu çıplak görünüyor. Bu, ne devam etmekte olduğu hakkında bir mesaj taşıyabilen, hatta temsile sayılar ekleyebilen gerçek emlak. Şimdi, WPF tamamen kapsayıcılar ve uzantılarla ilgili ve aklımı yavaş yavaş sardım, ancak bir "Metin" veya "İçerik" özelliği göremediğim için bir şeyler eklemek zorunda kalacağımı düşünüyorum benim ilerleme çubuğum olan kaba. Orijinal WinForms impulslarımdan daha doğal olan bir teknik mi yoksa iki mi var? Bu ilerleme çubuğuna metin eklemenin en iyi, en WPF doğal yolu nedir?

49
Jacob Proffitt

Metin eklemek için yeniden kullanılabilir bir yönteme ihtiyacınız varsa, metni görüntülemek için ek bir TextBlock'a sahip olan yeni bir Style/ControlTemplate oluşturabilirsiniz. Metni bir ilerleme çubuğunda ayarlamak için TextSearch.Text ekli özelliğini Hijack yapabilirsiniz. 

Yeniden kullanılabilir olması gerekmiyorsa, ilerleme çubuğunu bir Izgaraya koyup ızgaraya bir TextBlock ekleyin. WPF öğeleri bir araya getirebildiğinden, bu güzel çalışacaktır.

İsterseniz, ProgressBar ve TextBlock uygulamasını genel özellikler olarak ortaya çıkaran bir UserControl oluşturabilirsiniz, böylece özel bir ControlTemplate oluşturmaktan daha az iş olacaktır.

28
Abe Heidebrecht

Önceki yanıtların her ikisi de (yeni bir CustomControl veya Adorner__ oluşturmak) daha iyi uygulamalardır, ancak hızlı ve kirli olmak istiyorsanız (veya nasıl yapılacağını görsel olarak anlamak için), bu kod işe yarar:

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

Sadece z indeksinin listelenen son öğenin en üstte olacağı şekilde olduğunu unutmayın.

Ayrıca, eğer Kaxaml //henüz yok ise, mutlaka al - emin ol - şeyleri çözmeye çalışırken XAML ile oynamak için harika.

55
SmartyP

Bu çok basit olabilir (bunu işe almanın bir sürü yolu yoksa).

Bunu yapmak için Style dosyasını kullanabilir ya da bir TextBlock ve ProgressBar'ların üzerini kaplayabilirsiniz. 

Ben şahsen bunu bitirmeyi beklerken ilerleme oranını göstermek için kullanıyorum.

Çok basit tutmak için sadece oneBinding, sadece istiyorum. bu yüzden TextBock.Text adresini ProgressBar.Value dizinine ekledim.

Ardından işlemi tamamlamak için Kodu kopyalayı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>

İşte bunun nasıl göründüğü:

enter image description here

Yazının tamamı için WPF Eğitimi 'i kontrol edin. 

27
Felix D.

Üzerindeki metni görüntülemek için bir Adorner kullanabilirsiniz.

Adorners ile ilgili MSDN makalesine bakın

Adorner sınıfından miras alan bir sınıf yaratırsınız. İstediğiniz metni çizmek için OnRender yöntemini geçersiz kılın. İsterseniz, özel Adorner'ınız için görüntülemek istediğiniz metni içeren bir bağımlılık özelliği oluşturabilirsiniz. Sonra, bu Adorner'ı ilerleme çubuğunuzun adorner katmanına eklemek için bahsettiğim bağlantıdaki örneği kullanın.

5
Bob Wintemberg

ProgressBar öğesine sağ tıklayın ve Şablonu Düzenle> Bir Kopyasını Düzenle'ye tıklayın.

Ardından TextBlock öğesini, VS tarafından oluşturulan Stil'de Grid kapanış etiketinin hemen yukarısına gösterildiği gibi yerleştirin.

   <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

2 Özellikten Metin ve Ciltleme içeren ProgressBar (Değer/Maksimum değer):

<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


Aynı ancak % ilerleme ile:

<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