2012-03-28 2 views
0

버튼 컨트롤의 포커스를받을 때 여백을 줄이기위한 시나리오가 있습니다. 이는 Button 컨트롤의 테두리 속성을 늘리거나 같은 시간 (높이 및 너비)으로 유지하는 데 wan't 버튼을 사용하지 않기 때문입니다. 그래서 웹에 대한 약간의 노력으로 ValueConverter를 작성하고 마진을 줄이게되었습니다. 하지만 아직까지는 작업 코드를 입력 할 수 없습니다.버튼에 포커스가있을 때 버튼의 여백 줄이기

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    Thickness newMargin = new Thickness(); 
    Thickness margin = (Thickness)value; 
    Thickness reduceBy = (Thickness)parameter; 

    newMargin.Left = margin.Left - reduceBy.Left; 
    newMargin.Top = margin.Top - reduceBy.Top; 
    newMargin.Right = margin.Right - reduceBy.Right; 
    newMargin.Bottom = margin.Bottom - reduceBy.Bottom; 

    return newMargin; 
} 

Margin.Left에있는 StackOverflowException에서 위의 코드 결과를 재귀 적으로 호출되는 : 여기에 내가

<ControlTemplate.Triggers> <!--ControlTemplate for the Button--> 
         <Trigger Property="IsFocused" Value="True"> 
          <Setter Property="BorderBrush" TargetName="bdrButton" Value="Wheat"/> 
          <Setter Property="BorderThickness" TargetName="bdrButton" Value="2"/> 
          <Setter Property="Margin" TargetName="bdrButton" > 
           <Setter.Value> 
           <Binding ElementName="bdrButton" Path="Margin" Converter="{StaticResource N_MarginReducer}"> 
             <Binding.ConverterParameter> 
              <Thickness>1,1,1,1</Thickness> 
             </Binding.ConverterParameter> 
            </Binding> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 

이 변환기 XAML

를 뒤죽박죽 한 것입니다. 누구나 달성하려는 시나리오에 대해 더 나은 아이디어 나 구현 방법이 있습니다.

+0

? IValueConverter보다 쉬울 수도 있습니다. –

+0

Leslie, 답장을 보내 주셔서 감사합니다.하지만이 시나리오에서 어떻게 사용할 수 있는지 안내해주십시오. 필자는 MVVM 패턴을 따르는 파일 뒤에 코드를 사용하지 않을 것입니다. – Jatin

+0

예, MVVM을 따르지 않습니다. XAML을 살펴본 후에 한 가지 - bdrButton 여백에 대한 Setter의 값이 Setter 내에 있지 않은 것처럼 보입니까? 또는 복사/붙여 넣기가 잘못되었습니다. –

답변

0

변환기를 사용하는 대신 여백에 ThicknessAnimation을 사용하고 높이/너비에는 DoubleAnimation을 사용하려고합니다.

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.thicknessanimation.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.doubleanimation.aspx

예 :

Button 클래스에서 "LostFocus"와 "의 GotFocus"이벤트를 사용하려고하지 않는 이유는 무엇
<StackPanel> 
    <StackPanel.Resources> 
     <Thickness x:Key="unfocusedThickness" Top="15" Left="15" Right="15" Bottom="15"/> 
     <Thickness x:Key="focusedThickness" Top="5" Left="5" Right="5" Bottom="5"/> 
    </StackPanel.Resources> 
    <Button Height="100" Width="100" Margin="15"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.GotFocus"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="Height" From="100" To="120" Duration="0:0:0"/> 
         <DoubleAnimation Storyboard.TargetProperty="Width" From="100" To="120" Duration="0:0:0"/> 
         <ThicknessAnimation Storyboard.TargetProperty="Margin" From="{StaticResource unfocusedThickness}" To="{StaticResource focusedThickness}" Duration="0:0:0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      <EventTrigger RoutedEvent="Button.LostFocus"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="Height" From="120" To="100" Duration="0:0:0"/> 
         <DoubleAnimation Storyboard.TargetProperty="Width" From="120" To="100" Duration="0:0:0"/> 
         <ThicknessAnimation Storyboard.TargetProperty="Margin" To="{StaticResource unfocusedThickness}" From="{StaticResource focusedThickness}" Duration="0:0:0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button> 
    <TextBox /> 
</StackPanel> 
+0

여백 속성은 다른 단추에 대해 다르게 코딩되므로 하드 코드를 코딩 할 수 없습니다. 요소 바인딩을 사용하여 애니메이션의 "From"부분에서 사용할 여백을 얻더라도 마진의 "From"값과 "Mining"의 "From"값의 차이가되므로 애니메이션의 "To"부분에 어떤 값도 하드 코딩 할 수 없습니다 BorderThickness가 증가했습니다. 나는 "To"속성을 설정하기 위해 수학을 사용할 수 없다고 생각합니다. 답장을 보내 주셔서 감사합니다. 안부, Nirvan – Jatin

+0

잠시만 기다려주세요. 애니메이션의 "By"부분을 사용할 수 있다고 생각합니다. 곧 알려 드리겠습니다. – Jatin

+0

그것은 1 개의 경우에 그것을하는 방법의 다만보기이다, 당신은 그것 떨어져 건설 할 수 있어야합니다. 몇 가지 Thicknesses를 StaticResources로 정의하고 사용할 수 있습니다. 나는 그 모범을 새롭게 할 것이다. – Dylan