текст на progressbar в wpf

<p>это может быть легкой задачей для wpf cognoscenti, но я хотел бы знать, есть ли простой способ поместить текст в wpf progressbar. для меня пустой индикатор выполнения выглядит голым. это экранная недвижимость, которая может нести сообщение о<strong> что </strong>находится в процессе выполнения или даже просто добавлять цифры в представление. теперь wpf - это все о контейнерах и расширениях, и я постепенно обдумываю это, но так как я не вижу свойства «текст» или «содержимое», я думаю, что мне придется что-то добавить в контейнер, который является моим индикатором выполнения. есть ли техника или два, более естественные, чем мои оригинальные импульсы winforms? какой самый лучший, самый естественный для wpf способ добавить текст в этот индикатор?</p>

<p>если вам нужен многократно используемый метод для добавления текста, вы можете создать новый стиль/controltemplate, который имеет дополнительный textblock для отображения текста. вы можете перехватить вложенное свойство textsearch.text, чтобы установить текст на индикаторе выполнения. </p><p>если его не нужно многократно использовать, просто поместите индикатор выполнения в сетку и добавьте текстовый блок в сетку. поскольку wpf может составлять элементы вместе, это будет хорошо работать.</p><p>если вы хотите, вы можете создать usercontrol, который отображает progressbar и textblock в качестве открытых свойств, так что это будет меньше работы, чем создание пользовательского controltemplate.</p>

<p>оба предыдущих ответа (создание новой <code>customcontrol</code> или <code>adorner</code>) являются лучшими практиками, но если вы просто хотите быстро и грязно (или визуально понять, как это сделать), тогда этот код будет работать:</p><pre><code><grid width="300" height="50"> <progressbar value="50" /> <textblock horizontalalignment="center" verticalalignment="center"> my text </textblock> </grid> </code></pre><p>просто помните, что z-index таков, что последний элемент в списке будет сверху.</p><p>кроме того, если у вас еще нет <a href="http://www.kaxaml.com/">kaxaml</a> , обязательно поднимите его - это здорово для игры с xaml, когда вы пытаетесь разобраться.</p>

<p><strong>это может быть очень просто</strong> (если есть множество способов заставить это работать).</p><p>вы можете использовать <code>style</code>, чтобы сделать это, или просто наложить <code>textblock</code> и <code>progressbar</code>. </p><p>я лично использую это, чтобы показать процент прогресса при ожидании завершения.</p><blockquote> <p>для простоты я хотел иметь только <strong>one</strong> <code>binding</code>, поэтому я прикрепил <code>textbock.text</code> к <code>progressbar.value</code>.</p> </blockquote><p><strong>затем просто скопируйте код, чтобы сделать это.</strong></p><pre><code><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> </code></pre><p><strong>вот как это может выглядеть:</strong></p><p> <a href="https://i.stack.imgur.com/ovaw7.png"><img src="https://i.stack.imgur.com/ovaw7.png" alt="enter image description here"> </a> </p><p>посмотрите <a href="http://www.wpf-tutorial.com/misc-controls/the-progressbar-control/">wpf tutorial</a> для полного поста. </p>

<p>вы можете использовать adorner для отображения текста поверх него.</p><p>см. <a href="http://msdn.microsoft.com/en-us/library/ms743737(vs.85).aspx#adorn\_single\_element">msdn статью об украшениях</a> </p><p>вы должны создать класс, который наследуется от класса adorner. переопределите метод onrender, чтобы нарисовать нужный текст. если вы хотите, вы можете создать свойство зависимости для вашего пользовательского adorner, который содержит текст, который вы хотите отобразить. затем используйте пример в ссылке, которую я упомянул, чтобы добавить этого adorner в слой adorner вашего индикатора.</p>

<p>щелкните правой кнопкой мыши <code>progressbar</code> и выберите «изменить шаблон»> «редактировать копию».</p><p>затем поместите <code>textblock</code>, как показано ниже, чуть выше закрывающего тега <code>grid</code> в стиле, созданном vs.</p><pre><code> <border borderbrush="{templatebinding borderbrush}" borderthickness="{templatebinding borderthickness}" cornerradius="2"/> <textblock background="transparent" text="work in progress" foreground="black" textalignment="center"/> </grid> <controltemplate.triggers> </code></pre>

<p>progressbar с текстом и привязкой из 2-х свойств (<strong>значение/максимальное значение</strong>):</p><pre><code><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> </code></pre><p>rezult:</p><p> <a href="https://i.stack.imgur.com/cksag.png"> <img src="https://i.stack.imgur.com/cksag.png" alt="enter image description here"> </a> </p><hr><p>то же самое, но <strong>с% прогресса</strong>:</p><pre><code><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> </code></pre><p> <a href="https://i.stack.imgur.com/2irxr.png"> <img src="https://i.stack.imgur.com/2irxr.png" alt="enter image description here"> </a> </p>