Скругленный прямоугольник в Silverlight - PullRequest
0 голосов
/ 28 сентября 2011

Я пытаюсь создать прямоугольник в Silverlight, где углы скруглены. Однако я не указываю явно ширину и высоту прямоугольника, что означает, что он адаптируется к размеру сетки, в которой он находится (размер сетки зависит, помимо прочего, от разрешения экрана и неизвестен ранее). ).

Я бы хотел, чтобы свойства RadiusX и RadiusY были процентами от ширины и высоты прямоугольника соответственно. Каков был бы самый чистый способ сделать это? Есть ли способ сделать это только на XAML (без использования кода)?

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Два файла ниже для загрузки, которые я использовал для тестирования этого http://dl.dropbox.com/u/8679840/SilverlightApplication1.zip

Лучший способ для повторного использования - создать конвертер типов, например

<Grid x:Name="LayoutRoot" Background="White">
    <Rectangle x:Name="rectangle" 
    Width="200" Height="200"
    RadiusX="{Binding Width, ElementName=rectangle, Converter={StaticResource myConverter}, ConverterParameter=.1}" 
    RadiusY="{Binding Height, ElementName=rectangle, Converter={StaticResource myConverter}, ConverterParameter=.1}"
    />
</Grid>

и код

namespace SilverlightApplication1
{
      public class PercentConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            return System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter); 
        } 

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            throw new NotImplementedException(); 
        } 
    }
}
0 голосов
/ 23 октября 2011

Хотя ответ Джастина Кинга работает, если ширина и высота известны заранее, он не работает, если они не установлены, и родительский элемент управления динамически размещает прямоугольник. К сожалению, в Silverlight нельзя использовать связывание с конвертерами в ActualWidth и ActualHeight, поскольку они являются вычисляемыми свойствами. Это означает, что при изменении ActualWidth и ActualHeight событие изменения свойства внутренне не вызывается, поэтому привязка не будет распространять изменения на источник.

По сути, на данный момент единственным вариантом является подписка на событие LayoutUpdated, а также вычисление и установка свойств RadiusX и RadiusY в выделенном коде.

...