2012-02-01 187 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