2009-04-27 6 views
12

Brushes가 내 자신의 System.Windows.Media.Brush를 구현하는 방법에 대한 정보는 어디에서 찾을 수 있습니까? 나는 모든 freezable 수하물을 다룰 수는 있지만, 제대로 작동시키기 위해서는 무엇을 우선해야하는지 명확하지 않습니다.WPF에서 사용자 정의 브러시를 구현하려면 어떻게해야합니까?


네, 그렇기 때문에 미리 정의 된 브러시를 사용하고 싶지는 않았습니다. 추상 클래스 인 System.Windows.Media.Brush를 확장하고 싶습니다. 이것은 순전히 내 자신의 덕성을위한 것입니다. 나는 내가 할 수있는 브러시의 종류조차 모르겠다. 브러쉬가 어떻게 작동 하는지를 배우려고했습니다. 마찬가지로 : 클래스 내부 있습니다 추상적 인 멤버가 포함되어 있기 때문에

public AwesomeBrush : Brush 
{ 

    protected override Freezable CreateInstanceCore() 
    { 
     return new AwesomeBrush(); 
    } 

    ... // concrete brush stuff 

} 
+0

당신이하려는 일에 대해 좀 더 많은 정보를 제공하는 것이 도움이 될 수 있습니다. 브러시를 만들려면 무엇을해야할지 모르지만 wpf에 내장 된 많은 브러시 목록을 참조하십시오. http://msdn.microsoft.com/en-us/library/aa970904.aspx –

답변

3

당신은 System.Windows.Media.Brush 클래스에서 상속하여 사용자 지정 WPF 브러시를 만들 수 없습니다. 당신이 System.Windows.Media.Brush 클래스의 소스 코드를 볼 수 리플렉터를 사용하는 경우

, 다음 내부 추상 메소드가 표시됩니다

internal abstract DUCE.ResourceHandle AddRefOnChannelCore(DUCE.Channel channel); 
internal abstract DUCE.Channel GetChannelCore(int index); 
internal abstract int GetChannelCountCore(); 
internal abstract DUCE.ResourceHandle GetHandleCore(DUCE.Channel channel); 
internal abstract void ReleaseOnChannelCore(DUCE.Channel channel); 

이 오버라이드 (override) 할 수 있어야하지만 내부이기 때문에 할 수 없습니다.

참고 : 이전 대답은 System.Drawing.Brush이고 관련이 없기 때문에 내 대답을 편집했습니다. 그의 코멘트를 위해 Mikko Rantanen에게 특별한 감사.

+4

브러시 클래스에서 상속 가능 - 당신이 말했듯이, 추상적이고 추상적 인 클래스는 반드시 상속되어야합니다. –

+0

브러시를 상속받지 못하게하는 것은 무엇입니까? 모든 구현이 봉인 된 것을 알고 있지만 브러시에서 파생 될 수 있어야합니다. 맞습니까? – MojoFilter

+1

내부 생성자들! 나는 너에게 전에 좌절 당했다! – MojoFilter

9

Reflector을 사용하여 기존 브러시를 간략하게 살펴 보았습니다. 그것들의 구현이 꽤 닫혀 있고 많은 internal 배관 공사에 의존하는 것 같습니다. 자신의 브러시를 구현하는 것이 가능할 수도 있지만 지원되는 옵션이 아닌 것처럼 보입니다. WPF 컨트롤이 기존 브러시에 단단히 묶여 있으며 사용자 지정 컨트롤과 작동하지 않을 수도 있습니다.

대개 사용자 정의 브러시와 비슷한 것을 얻는 가장 좋은 방법은 DrawingBrush을 복잡한 그리기 논리와 함께 사용하는 것입니다. 다른 브러쉬를 사용하여 복잡한 모양에서 드로잉 브러시를 구성 할 수 있으므로 필요한 목표를 달성 할 수 있습니다. 이 같이

교육을위한 편집 후

업데이트, 당신은 반사경을 다운로드하고 브러쉬가 어떻게 작동하는지 볼 것을 사용하는 것이 가장 좋은 선택 일 수 있습니다. 그것들은 자기 구현을 목적으로하지 않으며 프로그래머가 정상적으로 액세스 할 수없는 어떤 종류의 internal 클래스에 의존하기 때문에 그렇게하기가 어렵습니다.

재미있는 점은 Brush documentation에는 상속인이 브러시에서 상속하는 올바른 방법으로 안내해야한다는 점입니다.

더 많은 업데이트

주위를 파고 나는 chinese blog에 비슷한 달성하기 위해 매우 깔끔한 방법을 발견했다. 마술 확장은 마크 업 확장을 사용하므로 브러시처럼 보입니다. 실제로는 속성에 따라 새로운 이미지 브러시를 만듭니다. 그는 쉬운 구현을 방해하는 내부 클래스가 있다는 동일한 결론에 도달했다고 봅니다.

+0

그럴 수도 있습니다. 프레임 워크에서 제공되는 브러시 구현으로는 수행 할 수없는 일은 아무 것도 상상할 수 없습니다. 재사용을 위해 실제로 구성 할 수있는 재미있는 방법이 있을지 궁금합니다. – MojoFilter

+0

Brush를 확장하지 않고 비슷한 것을 달성하는 업데이트를 추가했습니다. –

+1

브러시 설명서의 상속인에 대한 메모가 Microsoft 개인용인지, 궁극적 인 문서로 작성되지 않았는지 궁금합니다. 리플렉터를 보면 Brush의 필수 필드가 많이 보이고 GradientBrush가 내부 표시되어 있습니다. 그래서 우리는 그들을 만날 수 없습니다. –

3

MarkupExtensions를 사용하여 TypeConverter 특성을 사용하여 사용자 지정 브러시를 만드는 방법에 대한 가능한 모든 각도를 시도한 다음 DepawencyObject를 기반으로 래퍼 클래스를 만들고 Brush 유형의 DependencyProperty를 만듭니다 커스터마이제이션을 구현 한 다음 Bind to the Brush DependencyProperty를 구현하십시오.

<Line X1="0" Y1="-5" X2="200" Y2="-5" 
     Stroke="{Binding Source={StaticResource CustomBrush}, Path=Brush}" 
     StrokeThickness="12"/> 

난 당신이 참고 자료를 넣어 수 없기 때문에 이것은 MarkupExtension 솔루션보다 더 나은 생각 :

는 그 후,

<l:CustomBrush x:Key="CustomBrush" Brush="Magenta" /> 

는 그 다음에 바인딩 자원

에서 사용자 지정 브러시를 넣어 따라서 사용자 정의 설정을 사용할 때마다 사용자 정의 설정을 다시 정의해야합니다.

어떤 경우이든이 모든 Wpf 개체를 상속하는 간단한 솔루션 인 것처럼 보일 수 있으며 Bindings의 유연성을 사용하여 랩핑 된 Wpf 개체 자체의 멤버에 바인딩 할 수도 있습니다.

여기에 간단한 클래스입니다 :

public class CustomBrush : DependencyObject 
{ 
    public CustomBrush() 
    { 
     this.Brush = Brushes.Azure;  
    } 

    #region Brush DependencyProperty 

    [BindableAttribute(true)] 
    public Brush Brush 
    { 
    get { return (Brush)GetValue(BrushProperty); } 
    set { SetValue(BrushProperty, value); } 
    } 
    public static readonly DependencyProperty BrushProperty = 
     DependencyProperty.Register(
     "Brush", 
     typeof(Brush), 
     typeof(CustomBrush), 
     new UIPropertyMetadata(null)); 

    #endregion   
} 
4

당신이 사용자 정의 브러시가 복잡한 형상을 고려하는 것이 좋습니다 이유의 질문에 대답하고 변경하는 동안 당신은 모양과 일치하는 그라디언트를 채우려 모양의 중심 (또는 임의의 시작점)에서 방사형으로 색상을 지정합니다.

정적 채우기로 모든 기존 브러시를 제거 할 수있는 방법이 없습니다. 객체를 반복해서 복제하고 중첩하여 (그리고 모든 것을 올바르게 보이게하기 위해 선체 작업을하는 것부터) 각 객체를 다른 색상으로 채우는 것보다는 실제적인 방법은 채워지는 객체를 볼 수있는 브러시를 만드는 것입니다 .

이것은 실제로 Forms에서 수행 할 수 있습니다.

그러나 WPF에서 수행 할 수있는 방법이없는 것 같습니다. 불행합니다.

실제로 WPF의 브러시는 놀랍도록 강력하고 놀랍게도 제한적입니다. 그것들은 분명히 어떤 컨셉 모델에 맞도록 설계되었지만, 나는 아주 사소한 시각 효과를 넘어서 유용하다는 것을 전혀 확신하지 못한다. 평소처럼, 이상하게 묘사 된 (잘 설명되어 있지 않은) 매개 변수로 더욱 복잡 해졌다. 간단하고, 다소 복잡하다.

관련 문제