2014-04-22 3 views
1

Button에서 확장하는 사용자 정의 버튼이 있고 생성자에서 IsMouseOver 속성 트리거를 추가하여 색상을 변경하려고합니다.C# 코드에서 Button에 IsMouseOver 트리거를 추가하는 방법은 무엇입니까?

제발, "xaml에서해야하는 제안 ..."은 질문이 아닙니다.

나는 아래에 노력하고 있지만 오류가 :

public powerButton() 
    { 
     if (DesignerProperties.GetIsInDesignMode(this) || !DesignerProperties.GetIsInDesignMode(this)) 
     { 
      ApplyBackgroundStyle(); 
     } 

     /* 
     Style style = new Style(); 
     style.TargetType = typeof(Button); 
     DataTrigger trigger = new DataTrigger(); 
     trigger.Value = "OK"; 
     //set binding 
     trigger.Binding = new Binding() { Path = new PropertyPath("Content"), RelativeSource = RelativeSource.Self }; 
     Setter setter = new Setter(); 
     setter.Property = Button.IsMouseOverProperty; 
     setter.Value = Brushes.Green; 
     trigger.Setters.Add(setter); 
     //clear the triggers 
     style.Triggers.Clear(); 
     style.Triggers.Add(trigger); 
     this.Style = style;*/ 
    } 
+0

대부분의 개발자는 xaml 구성에 익숙하지 않지만 OOP 지향적 인 사람은 매우 강력합니다. 코드를 사용하면 개발 및 유지 보수 시간을 절약 할 수 있습니다. 나는 당신이 xaml에 대해 매우 열정적이라고 이해하고 대부분의 사람들은 사용자 정의 제어 styiling을 위해 이것을 사용합니다. 우리는 예외라고 생각합니다. 최선의 선택이며 clr이 그렇게 할 수 있습니다. 나는 여기에없는 "길"에 대한 또 다른 주제를 행복하게 만들 수 있습니다. – RollRoll

+0

죄송합니다. XAML을 모르거나 배울 수 없으면 winforms로 돌아가십시오. [** WPF Mentality **] (http://stackoverflow.com/a/15684569/643085)는 winforms 접근 방식과 완전히 다르며 WPF는 이러한 방식으로 사용되지 않습니다. 앞으로이 결정을 후회하게 될 것입니다. winforms 방식으로 WPF를 사용하는 것은 누구에게나 ** 최선의 선택입니다 **. –

+0

BTW, "XAML 구성"같은 것은 없습니다. XAML의 선언적 특성을 완전히 오해하는 것 같습니다. 그것은 "설정"이 아니며 여기에 게시 한 무시 무시한 코드보다 훨씬 더 깨끗한 방식으로 그래프를 선언하고 객체화 할 수있는 선언적 언어입니다. –

답변

2

에 적용 할 수있는 Brushes.Green 값이, 당신이 이런 식으로 뭔가를 찾고 생각 :

Style style = new Style(); 
style.TargetType = typeof(Button); 
MultiDataTrigger trigger = new MultiDataTrigger(); 
Condition condition1 = new Condition(); 
condition1.Binding = new Binding() { Path = new PropertyPath("Content"), RelativeSource = RelativeSource.Self }; 
condition1.Value = "OK"; 
Condition condition2 = new Condition(); 
condition2.Binding = new Binding(){Path = new PropertyPath("IsMouseOver"), RelativeSource = RelativeSource.Self}; 
condition2.Value = true; 
Setter setter = new Setter(); 
setter.Property = Button.ForegroundProperty; 
setter.Value = Brushes.Green; 
trigger.Conditions.Add(condition1); 
trigger.Conditions.Add(condition2); 
trigger.Setters.Add(setter); 
style.Triggers.Clear(); 
style.Triggers.Add(trigger); 
this.Style = style; 
두 가지 조건이 충족 될 때 버튼의 Foreground 색이 녹색으로 발생합니다

:

1 일 - Button.Content"OK"

= 2 - 마우스가 Button 이상이다. 다음 XAML로 표현 될 수

: WPF의 UI 요소에서 상속 시각적 스타일 또는 시각적 행동을 설정하는 단순한 사용자 버튼을 생성 할 필요없이 어떠한

<Button Content="OK"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Content, RelativeSource={RelativeSource Self}}" Value="OK"/> 
         <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"/> 
        </MultiDataTrigger.Conditions> 

        <Setter Property="Foreground" Value="Green"/> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

.

WPF UI 요소를 서브 클래 싱하면 유지 관리가 줄어들고 완전히 불필요하기 때문에 사용하지 않는 것이 좋습니다. WPF UI 모델은 Lookless 컨트롤을 기반으로합니다. 즉, 컨트롤 시각적 모양은 해당 기능과 완전히 별개이며 독립적입니다. 일반적으로 WPF UI 요소의 하위 클래스는 의 새 기능을 정의하는 것입니다. 모양을 변경하는 대신 WPF의 기본 제공 메커니즘 인 Styles and Templates을 통해 수행 할 수 있습니다.

winforms 방식과 달리 WPF에서 적절한 WPF 방식을 사용하는 것이 좋습니다. 위의 코드는 C# 코드로 절차 적으로 객체 그래프를 만드는 것이 얼마나 복잡하고 번거로운지를 보여줍니다. XAML에서는 더 간단하고 훨씬 더 깨끗합니다. "condition1, condition2"등 불필요한 상용구가 없기 때문입니다.

개발자가 XAML에 익숙하지 않은 경우 웹에 수많은 XAML 자습서가 있으며 악의적으로 MSDN에이 주제에 대한 포괄적 인 설명서가 있습니다.

아래로 가면 WPF Visual Tree의 복잡성과 UI Virtualization과 같은 개념으로 인해 절차적인 방식으로 UI에서 작동하기가 어렵다는 현재 접근 방식에 중대한 문제가 있습니다.

MVVM 접근법과 적절한 DataBinding을 WPF의 전통적인 winforms 방식과 반대 (다시)하는 것이 좋습니다.

여기서도 WPF에 접근하는 것은 고통, 고문 및 실패, 그리고 예기치 않은 모든 종류의 오류가 발생하기 쉬운 엄청난 양의 완전히 불필요하고 유지 보수가 불가능한 확장 불가능한 코드 만 가져올 것이라고 강조 할 수 없습니다. 쉽게 해결할 수없는 코드

0

그것은 오타처럼 보이는 : 당신은 IsMouseOver 속성에 대한 Brushes.Green 값을 설정하려고

Setter setter = new Setter(); 
setter.Property = Button.BackgroundProperty; // Here it was Button.IsMouseOverProperty 
setter.Value = Brushes.Green; 
trigger.Setters.Add(setter); 

하고, 그렇지 않은 일 때문에 :

  • IsMouseOver입니다 읽기 전용 재산

  • 질문을 바탕으로 같은 배경으로 붓을 속성 및 전경 특성

+0

나는 당신을 얻었습니다, 지금 나는 올바른 길을 사용하지 않고 있습니다. 그러나 예제에서 IsMouseOver 속성에 접근하는 방법을 알지 못합니다. – RollRoll

+0

@ ThePoet : 버튼 배경을 변경하는 조건을 이해하지 못합니다. 기본 ('IsMouseOver = "True"또는 "Content ="OK "') 조건은 무엇입니까? –

관련 문제