2017-10-26 3 views
2

Image 컨트롤에서 상속 된 사용자 지정 클래스를 빌드하려고하는데 바인딩하는 데 문제가 있습니다. 내가응용 프로그램 리소스에서 DependancyProperty를 컨트롤 DependancyProperty (리소스를 사용하는)에 바인딩

그래서 내 App.xaml 자원에 내가 몇 DrawingImages이 하나의 예 (즉, 벡터 이미지를 위해 제공되는 기능) 내 자원 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의 내 브러시 바인딩이 맞춤 클래스의 내 색상 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이 부분적으로 어떤 것인가를 기반으로 외관을 변경하고자하므로 공유 리소스로 표시하지 마십시오 (이 경우 공유되는 것은 싱글 톤과 같음 - 하나의 글로벌 인스턴스 만 의미 함).) :

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

은 그런 대신 SetResourceReference를 사용하는 이런 식으로 작업을 수행합니다

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

이 다른 대답이 제안처럼 IconImage에서 직접 DrawingImage XAML 퍼팅과 거의 동일합니다.

그런데 리소스에 대한 고유 한 이름을 더 많이 사용하는 것이 좋습니다 (특히 FindResource을 사용하려는 경우).

+0

이 작품! 감사! 하나의 작은 문제는 디자인 타임에 아무것도 얻지 못했지만 응용 프로그램을 실행 한 후에 만 ​​나타납니다. 이것에 대한 제안? –

+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

관련 문제