Я должен объявить преобразователи в App.xaml или как ресурс на файл?

Всегда существует 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;
}

, Как упомянуто, это имеет свои пределы (фон позади округленного поля должен быть простым иначе, углы не будут соответствовать фону), но это работает очень хорошо на что-либо еще.

<час>

Обновленный: Улучшенный реализация при помощи листа спрайта.

15
задан Sean Hanley 6 January 2012 в 17:40
поделиться

3 ответа

Ну, я просто вообще не объявляю их в 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.

47
ответ дан 1 December 2019 в 00:23
поделиться

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.

2
ответ дан 1 December 2019 в 00:23
поделиться

Если вам нужен преобразователь только для одного окна, я бы поместил его для одного окна (или даже только для элемента управления контейнера, который содержит элемент управления, который его использует).

I Я бы сказал, что это более удобно в обслуживании - вы можете посмотреть объявление преобразователя и узнать, что его использует. Вы знаете, что если вы измените элементы управления на этой конкретной странице, чтобы больше не использовать конвертер, вы можете удалить его из ресурсов страницы, не затрагивая что-либо еще. И наоборот, если конвертер является ресурсом приложения, не так просто определить, что его использует, если вообще.

Если один и тот же конвертер используется более чем на одной странице, я бы все равно поставил его под каждой страницей ресурса. На самом деле, это всего лишь одна лишняя строка в XAML.

Во всяком случае, это мое мнение на сегодняшний день. Я' м ожидая еще одного поста, утверждающего с точностью до наоборот. : -)

0
ответ дан 1 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: