Управление Wpf соединяет строки в тексте / содержимом

#c# #wpf

#c# #wpf

Вопрос:

У меня есть кнопка с ресурсами:

 Content="{x:Static resPath:Resources.ZoomIn}"
  

какое значение = «Увеличить». Я хочу добавить к этому содержимому «x1». Чтобы получить значение = «Увеличить в x1».

Я хочу сделать что-то вроде этого:

 Content="{x:Static resPath:Resources.ZoomIn}   x1"
Content="{x:Static resPath:Resources.ZoomIn}   {x1}"
  

Но это выдает ошибку.

Ответ №1:

Используйте текстовый блок в качестве содержимого:

 <Button>
    <TextBlock>
        <Run Text="{x:Static resPath:Resources.ZoomIn}"/>
        <Run Text="x1"/>
    </TextBlock>
</Button>
  

или

 <Button>
    <TextBlock>
        <Run Text="{x:Static resPath:Resources.ZoomIn}"/> x1
    </TextBlock>
</Button>
  

Комментарии:

1. Я думаю, что это более чистый способ достижения результата. Мы не знаем полного требования, но я думаю, вы вполне могли бы «увеличивать» разные величины, такие как x1 или x2 или x3. Четное использование значения ползунка. Отдельные прогоны (возможно, 3 с x в другом) позволят вам связать это число.

2. @Andy Я думаю, что это личное предпочтение, но я согласен с тем, что синтаксис разметки более сложный и его труднее читать, я добавил его в качестве альтернативного подхода к тому, что предложил @Clemens. Я просто хочу добавить, что для сценария, который вы описываете, вы могли бы также использовать StringFormat в MultiBinding .

3. Одно можно сказать наверняка. На самом деле вам не нужна привязка для достижения желаемого результата. IMO это просто добавляет ненужную сложность, и поэтому его следует избегать.

4. Я бы сказал, что это инженерный принцип выбора самого простого варианта. Решающими факторами являются простота чтения и простота. Но приложение все равно будет работать нормально при любом подходе.

Ответ №2:

Вы можете использовать a TextBlock с a Binding и StringFormat для форматирования связанного текста.

 <Button>
    <TextBlock Text="{Binding Source={x:Static resPath:Resources.ZoomIn}, StringFormat={}{0} x1}"/>
</Button>
  

Это {} escape-последовательность, {0} которая просто ссылается на привязанное значение (при привязке нескольких значений, например, с помощью a MultiBinding вы можете получить доступ к нескольким), а остальное — ваш пользовательский текст.

Комментарии:

1. Это имело бы смысл в случае, если ZoomIn является статическим свойством с уведомлением об изменении. Вы бы написали Text="{Binding Path=(resPath:Resources.ZoomIn), StringFormat={}{0} x1}" .

2. Извините, но таким образом оказалось, что он некорректно отображает позиции кнопок на панели стека.