无法从静态资源设置CornerRadius值

时间:2012-02-01 13:01:03

标签: silverlight xaml resourcedictionary 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'。

我做错了什么?我如何使其工作?谢谢。

3 个答案:

答案 0 :(得分:3)

<sys:Double x:Key="ScrollbarHandleCrValue">3</sys:Double>
<CornerRadius x:Key="ScrollbarHandleCornerRadius" 
   TopLeft="{StaticResource ScrollbarHandleCrValue}" 
   TopRight="{StaticResource ScrollbarHandleCrValue}" 
   BottomRight="{StaticResource ScrollbarHandleCrValue}" 
   BottomLeft="{StaticResource ScrollbarHandleCrValue}" />

...
<Border Name="Border"
   CornerRadius="{StaticResource ScrollbarHandleCornerRadius}" 
   Background="{StaticResource ScrollbarHandleColor}"
   BorderBrush="Transparent"
   BorderThickness="1" />
...

答案 1 :(得分:2)

MSDN

  

您可以在XAML中设置此值,但仅作为采用CornerRadius的属性的属性语法的一部分,或作为CornerRadius对象元素的初始化文本。请参阅CornerRadius的XAML部分和备注部分。

您可以尝试绑定整个CornerRadius属性并使用转换器获取所有资源,并使用构造函数从它们创建CornerRadius实例。

e.g。仅使用一个值:

<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中存在问题)

答案 2 :(得分:0)

我认为CornerRadius属性不是DependencyProperties,因此无法通过绑定设置它们。

我能想到的两个选择是使用MultiConverter接受Border对象的参数和期望的CornerRadius,或者为{{创建自定义DependencyProperty 1}}。这两种方法都需要您在代码隐藏中设置值。