2012-02-01 12 views
1

からCornerRadius値を設定できません:XAMLファイルで後で私は静的リソース定義した静的リソース

<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> 
... 

を、私は境界線の左上の角の半径を設定するときにその値を使用しようとしています:

<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

に注意してください(これはあなたのコードは、あなたがSilverlightの質問がある場合は、問題が実際にWPFに存在しない限り、WPFタグを避けてください、だけで正常に動作WPFにSilverlightの-唯一の問題は、あります)私は左上隅を特定する必要があります。他のコーナーは、他の静的リソース値にバインドする必要があります。 – Boris

+0

実行時に変更する場合は、DynamicResourceにします。 – 0x4f3759df

答えて

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(); 
    } 
} 

あなたはpropbablyリソースがツリーを上がっていくと直接リソースが定義されているオブジェクトをターゲットにないために検索して、これは、より汎用的にすることができます。

+0

ありがとうございました! – Boris

0

私はCornerRadiusのプロパティはDependencyPropertiesではないと信じているので、バインディングで設定することはできません。

私は考えることができる2つの選択肢がBorderオブジェクトのパラメータを受け取りMultiConverterを使用することで、CornerRadiusを希望、またはCornerRadiusのカスタムたDependencyPropertyを作成します。どちらの方法でもコードビハインドで値を設定する必要があります。

+0

'CornerRadius'はDPです。 –

+0

@HB Hrrm私はそれが構造物だと思った。実際には、私はあなたが意味するものを見て、 'Border.CornerRadius'は依存性のプロパティですが、' CornerRadius'のプロパティはそうではありません。私は私の答えを編集しました。 – Rachel

+0

型 'CornerRadius'はもちろん構造体ですが、 'Border。CornerRadius'はDPです。これはバインディングではなく、他のマークアップ拡張(StaticResourceなど)を任意のプロパティで使用できます。 –

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

関連する問題