2017-10-26 3 views
2

Imageコントロールから継承したカスタムクラスを作成しようとしていますが、バインディングに問題があります。アプリケーションリソースからDependancyPropertyをコントロールDependancyProperty(リソースを使用している)にバインドする

私はいくつかのDrawingImages、1の例を持っている私のApp.xamlリソースでそう(つまり、ベクトル画像のために供給されているものです)私のリソースに

をDrawingImageを使用しています:

<DrawingImage x:Key="Shutdown"> 
      <DrawingImage.Drawing> 
       <DrawingGroup> 
        <DrawingGroup.Children> 
         <DrawingGroup> 
          <DrawingGroup.Children> 
           <GeometryDrawing Brush="{x:Null}"> 
            <GeometryDrawing.Pen> 
          Here--> <Pen Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Thickness="2" /> 
            </GeometryDrawing.Pen> 
            <GeometryDrawing.Geometry> 
             <PathGeometry FillRule="Nonzero" Figures="M8.332,4.941C5.759,6.271 4,8.956 4,12.052 4,16.47 7.582,20.052 12,20.052 16.418,20.052 20,16.47 20,12.052 20,8.911 18.19,6.193 15.555,4.884" /> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
         Here--> <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Pen="{x:Null}"> 
            <GeometryDrawing.Geometry> 
             <RectangleGeometry RadiusX="0" RadiusY="0" Rect="11,2,2,10" /> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
          </DrawingGroup.Children> 
          <DrawingGroup.ClipGeometry> 
           <RectangleGeometry Rect="0,0,24,24" /> 
          </DrawingGroup.ClipGeometry> 
         </DrawingGroup> 
        </DrawingGroup.Children> 
       </DrawingGroup> 
      </DrawingImage.Drawing> 
     </DrawingImage> 

public class IconImage : Image 
{ 
    public enum Icons 
    { 
     None, 
     Shutdown, 
     Minimize 
    } 

    private Icons _icon; 
    public Icons Icon 
    { 
     get { return _icon; } 
     set 
     { 
      _icon = value; 
      if (value == Icons.None) 
      { 
       Visibility = Visibility.Hidden; 
      } 
      else 
      { 
       Visibility = Visibility.Visible; 
       this.SetResourceReference(Image.SourceProperty, value.ToString()); 
      } 
     } 
    } 

    public static readonly DependencyProperty ColourProperty = DependencyProperty.Register("Colour", typeof(Brush), typeof(IconImage), new PropertyMetadata(Brushes.Black)); 

    public Brush Colour 
    { 
     get { return (Brush)GetValue(ColourProperty); } 
     set { SetValue(ColourProperty, value); } 
    } 
} 

Usasge:次のように私は私のカスタムクラスを構築している

<local:IconImage Icon="Shutdown" Colour="CornflowerBlue" /> 

DrawingImagesの私のBrushバインディングは、カスタムクラスのColor DependancyPropertyにバインドされず、これを実現する方法や、可能であれば考えられません。私がブラシをハードコードすると、それは完全に(明らかに)動作します。私は、デザイン時にコントロールから、またはコードの背後にあるいつでも、それらの色を変更できるようにする必要があります。

ありがとうございます!

-Sean-

+0

'DrawingImage'はどこで使用されましたか? 'DrawingImage'に対して' local:IconImage'の 'AncestorType'を持っていますか? – Iron

+0

Iconプロパティが設定されている場合に使用されます。this.SetResourceReference(Image.SourceProperty、value.ToString());この場合、DynamicReferenceを "Shutdown"に設定します。 –

+0

'x:Key =" Shutdown "'のリソースを使用するコードを表示してください。 – Iron

答えて

0

あなたはそれがこのように動作させることができます。 DrawingImageには、IconImageが含まれている外観を変更する必要があるため、共有リソースとしてはあまり意味がありません(この場合の共有は、シングルトンのように意味する - グローバルインスタンスは1つだけです) ):

var resource = FindResource(value.ToString()); 
// alternative 
// var resource = Application.Current.Resources[value.ToString()]; 
this.Source = (ImageSource)resource;  

これは、他の答えは示唆しているようIconImageの下に直接ごDrawingImage XAMLを置くとほぼ同じになります。そして、

<DrawingImage x:Key="Shutdown" x:Shared="False"> 
    <!-- the rest --> 
</DrawingImage> 

代わりのSetResourceReferenceを使用しては、このようにそれを行います。

(特にFindResourceを使用する場合は)ツリーの下に同じ名前のリソースが誤って使用されるのを避けるため、リソースの一意の名前を持つ方がよいでしょう。

+0

これは機能します!ありがとう!小さな問題の1つは、設計時に何も得られず、アプリケーションを実行すると表示されます。これに対する提案はありますか? –

+0

ユニークな名前については、ユニークな名前が多く、ユニークな名前はほんの一握りです。これは単なる例であった。 –

+0

@SeanMakinsよくWPFデザイナーにあなたが望むものを表示させるのはかなり難しいです...この場合、リソースを見つけて読み込みますが、何らかの理由で 'Colour'プロパティにバインドできません。必要に応じて、これをデバッグするためにVisual Studioの別のインスタンスをアタッチすることもできます。一時的な解決策として、以下のようにバインディングの代替値を指定します: ' Evk

-1
<local:IconImage Icon="Shutdown" Colour="CornflowerBlue"> 
    <local:IconImage.Source> 
     <DrawingImage> 
      <DrawingImage.Drawing> 
       <DrawingGroup> 
        <DrawingGroup.Children> 
         <DrawingGroup> 
          <DrawingGroup.Children> 
           <GeometryDrawing Brush="{x:Null}"> 
            <GeometryDrawing.Pen> 
             <Pen Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Thickness="2" /> 
            </GeometryDrawing.Pen> 
            <GeometryDrawing.Geometry> 
             <PathGeometry FillRule="Nonzero" Figures="M8.332,4.941C5.759,6.271 4,8.956 4,12.052 4,16.47 7.582,20.052 12,20.052 16.418,20.052 20,16.47 20,12.052 20,8.911 18.19,6.193 15.555,4.884" /> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
           <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Pen="{x:Null}"> 
            <GeometryDrawing.Geometry> 
             <RectangleGeometry RadiusX="0" RadiusY="0" Rect="11,2,2,10" /> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
          </DrawingGroup.Children> 
          <DrawingGroup.ClipGeometry> 
           <RectangleGeometry Rect="0,0,24,24" /> 
          </DrawingGroup.ClipGeometry> 
         </DrawingGroup> 
        </DrawingGroup.Children> 
       </DrawingGroup> 
      </DrawingImage.Drawing> 
     </DrawingImage> 
    </local:IconImage.Source> 
</local:IconImage> 
+0

これは動作すると確信していますが、これでソースを動的に設定することはできません。このコントロールを使用するたびにDrawingImage全体を指定する必要はありません。 (これは何度も使用されています)、実行時に変更されることがあります。これがIconプロパティを持つ理由です。 –

+0

'Icon'を' DependencyProperty'にし、 'IconImage'に' Style'を使ってあなたが望むものを得る方法はありますか? – Iron

関連する問題