2012-02-01 188 views
1

设置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”。

我在做什么错?我如何使它工作?谢谢。

+0

请注意我确实需要详细说明左上角。其他角落应该绑定到其他一些静态资源值... – Boris 2012-02-01 13:02:29

+0

如果您想在运行时更改它,请将其设为DynamicResource。 – 0x4f3759df 2012-02-01 16:01:08

回答

2

MSDN

您可以在XAML此值,但只能作为该采取CornerRadius,或作为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中确实存在)

+0

非常感谢! – Boris 2012-02-03 07:23:26

0

我相信CornerRadius属性不是DependencyProperties,所以它们不能通过绑定来设置。

的两个备选方案我能想到的是使用其中MultiConverter接受Border对象的参数,和所希望的CornerRadius,或以产生用于CornerRadius定制的DependencyProperty。这两种方法都要求您在代码隐藏中设置值。

+0

'CornerRadius'是一个DP。 – 2012-02-01 15:37:17

+0

@HB Hrrm我认为这是一个结构。其实我明白你的意思,'Border.CornerRadius'是一个依赖属性,但是'CornerRadius'上的属性不是。我编辑了我的答案。 – Rachel 2012-02-01 15:45:14

+0

“CornerRadius”类型当然是一个结构,但是“边界”。CornerRadius'是一个DP,也不是一个绑定,你可以在任何属性上使用其他标记扩展(如'StaticResource')。 – 2012-02-01 15:49:21

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" /> 
... 
+0

谢谢谢谢谢谢,我只是无法解决这个问题,任何遇到这个问题的人都应该承担记忆,用于其他任何涉及这种性质的XAML的内存=) – Coops 2013-07-16 11:03:03