Всегда существует JavaScript путь (см. другие ответы), но так как это, просто разрабатывает, я отчасти против клиентских сценариев использования для достижения этого.
способ, которым я предпочитаю (хотя он имеет свои пределы), должен использовать 4 изображения скругленного угла, которые Вы расположите в 4 угла своего поля с помощью CSS:
<div class="Rounded">
<!-- content -->
<div class="RoundedCorner RoundedCorner-TopLeft"></div>
<div class="RoundedCorner RoundedCorner-TopRight"></div>
<div class="RoundedCorner RoundedCorner-BottomRight"></div>
<div class="RoundedCorner RoundedCorner-BottomLeft"></div>
</div>
<час> /********************************
* Rounded styling
********************************/
.Rounded {
position: relative;
}
.Rounded .RoundedCorner {
position: absolute;
background-image: url('SpriteSheet.png');
background-repeat: no-repeat;
overflow: hidden;
/* Size of the rounded corner images */
height: 5px;
width: 5px;
}
.Rounded .RoundedCorner-TopLeft {
top: 0;
left: 0;
/* No background position change (or maybe depending on your sprite sheet) */
}
.Rounded .RoundedCorner-TopRight {
top: 0;
right: 0;
/* Move the sprite sheet to show the appropriate image */
background-position: -5px 0;
}
/* Hack for IE6 */
* html .Rounded .RoundedCorner-TopRight {
right: -1px;
}
.Rounded .RoundedCorner-BottomLeft {
bottom: 0;
left: 0;
/* Move the sprite sheet to show the appropriate image */
background-position: 0 -5px;
}
/* Hack for IE6 */
* html .Rounded .RoundedCorner-BottomLeft {
bottom: -20px;
}
.Rounded .RoundedCorner-BottomRight {
bottom: 0;
right: 0;
/* Move the sprite sheet to show the appropriate image */
background-position: -5px -5px;
}
/* Hack for IE6 */
* html .Rounded .RoundedCorner-BottomRight {
bottom: -20px;
right: -1px;
}
, Как упомянуто, это имеет свои пределы (фон позади округленного поля должен быть простым иначе, углы не будут соответствовать фону), но это работает очень хорошо на что-либо еще.
<час>Обновленный: Улучшенный реализация при помощи листа спрайта.
Ну, я просто вообще не объявляю их в xaml. Вместо этого я дополнительно получил свой конвертер из MarkupExtension
. Примерно так:
public class MyValueConverter : MarkupExtension, IValueConverter
{
private static MyValueConverter _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null) _converter = new MyValueConverter();
return _converter;
}
public object Convert
(object value, Type targetType, object parameter, CultureInfo culture) { }
public object ConvertBack
(object value, Type targetType, object parameter, CultureInfo culture) { }
}
Это позволяет мне использовать мой конвертер где угодно, например:
Source="{Binding myValue, Converter={converters:MyValueConverter}}"
где конвертеры - это пространство имен, в котором я объявил свой конвертер.
Этому трюку научился только из старого потока stackoverflow.
I have a ResourceDictionary that declares several commonly needed converters, such as a bool-to-visibility converter. I reference this dictionary directly in App.xaml.
I declare other converters that are more specific to a given situation at the Page/Window-level (or in a ResourceDictionary referenced by a Page/Window).
I can't answer the performance question definitively, but I would be very surprised if it made a practical difference in load time or memory usage. Declaring a converter is basically an object instantiation, so it should be very efficient and use very little memory, but I haven't done any profiling to compare app-level vs. window-level performance.
Если вам нужен преобразователь только для одного окна, я бы поместил его для одного окна (или даже только для элемента управления контейнера, который содержит элемент управления, который его использует).
I Я бы сказал, что это более удобно в обслуживании - вы можете посмотреть объявление преобразователя и узнать, что его использует. Вы знаете, что если вы измените элементы управления на этой конкретной странице, чтобы больше не использовать конвертер, вы можете удалить его из ресурсов страницы, не затрагивая что-либо еще. И наоборот, если конвертер является ресурсом приложения, не так просто определить, что его использует, если вообще.
Если один и тот же конвертер используется более чем на одной странице, я бы все равно поставил его под каждой страницей ресурса. На самом деле, это всего лишь одна лишняя строка в XAML.
Во всяком случае, это мое мнение на сегодняшний день. Я' м ожидая еще одного поста, утверждающего с точностью до наоборот. : -)