Невозможно установить значение CornerRadius из статического ресурса

Я определил статический ресурс:

<UserControl x:Class="MyProject.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:sys="clr-namespace:System;assembly=mscorlib" 
   mc:Ignorable="d" 
   Width="255" 
   Height="300">

   <UserControl.Resources>
      <sys:Double x:Key="CornerRadiusValue">5</sys:Double>
   </UserControl.Resources>
...

Позже в файле XAML я пытаюсь использовать это значение при установке радиуса верхнего левого угла для границы:

<Border 
   Width="40"
   Height="30"
   BorderThickness="1,1,0,0" 
   BorderBrush="Red">
      <Border.CornerRadius>
         <CornerRadius TopLeft="{StaticResource CornerRadiusValue}" />
      </Border.CornerRadius>
</Border>

Во время разработки все работает нормально, и изменение значения статического ресурса CornerRadiusValue изменяет радиус угла на границе. Однако, когда я хочу запустить это, я получаю исключение XamlParseException с сообщением:

Невозможно установить свойство "System.Windows.CornerRadius.TopLeft" только для чтения.

Что я делаю неправильно? Как заставить это работать? Спасибо.


person Boris    schedule 01.02.2012    source источник
comment
Обратите внимание, что мне нужно быть конкретным в верхнем левом углу. Другие углы должны быть привязаны к некоторым другим значениям статических ресурсов...   -  person Boris    schedule 01.02.2012
comment
Сделайте его DynamicResource, если вы хотите изменить его во время выполнения.   -  person patrick    schedule 01.02.2012


Ответы (3)


MSDN :

Вы можете установить это значение в XAML, но только как часть синтаксиса атрибута для свойств, которые принимают CornerRadius или как текст инициализации CornerRadius элемент объекта. См. разделы XAML и разделы «Примечания» документа . Угловой радиус.

Вы можете попытаться связать все свойство CornerRadius и использовать преобразователь, чтобы получить все ресурсы и создать из них экземпляр CornerRadius с помощью конструктора.

например используя только одно значение:

<Border Name="bd" BorderBrush="Red" BorderThickness="1">
    <Border.Resources>
        <sys:Double x:Key="CR_TopLeft">5</sys:Double>
    </Border.Resources>
    <Border.CornerRadius>
        <Binding ElementName="bd">
            <Binding.Converter>
                <vc:CornerRadiusConverter />
            </Binding.Converter>
        </Binding>
    </Border.CornerRadius>
    <Button>!</Button>
</Border>
public class CornerRadiusConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var resourceSource = (FrameworkElement)value;
        var topLeft = (double)resourceSource.Resources["CR_TopLeft"];
        return new CornerRadius(topLeft, 0, 0, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Возможно, вы могли бы сделать это более общим, выполнив поиск ресурсов, идущих вверх по дереву, а не напрямую нацеливая объект, для которого определены ресурсы.

(Эта проблема касается только Silverlight, в WPF ваш код работает нормально, если у вас есть вопрос по Silverlight, избегайте использования тега WPF, если только проблема действительно не существует в WPF)

person H.B.    schedule 01.02.2012

Я считаю, что свойства CornerRadius не являются DependencyProperties, поэтому их нельзя установить через привязку.

Я могу придумать две альтернативы: использовать MultiConverter, который принимает параметры объекта Border и желаемого CornerRadius, или создать собственное DependencyProperty для CornerRadius. Оба метода потребуют от вас установки значения в коде программной части.

person Rachel    schedule 01.02.2012
comment
@HB Hrrm Я думал, что это Struct. На самом деле я понимаю, что вы имеете в виду, Border.CornerRadius является свойством зависимости, однако свойства CornerRadius - нет. Я отредактировал свой ответ. - person Rachel; 01.02.2012
comment
Тип CornerRadius, конечно, является структурой, но Border.CornerRadius — это DP, также это не привязка, вы можете использовать другие расширения разметки (например, StaticResource) для любого свойства. - person H.B.; 01.02.2012
comment
@HB Hrrm Я узнаю что-то новое каждый день. Я никогда не задумывался об этом, но я полагаю, что это имеет смысл, поскольку StaticResource разрешается один раз, поэтому DependencyProperty не требуется. - person Rachel; 01.02.2012

person    schedule
comment
Спасибо, спасибо, спасибо, я просто не мог решить это, любой, кто сталкивается с этим, должен зафиксировать память для использования во всем, что связано с XAML такого рода =) - person Coops; 16.07.2013