2012-03-28 4 views
0

У меня есть сценарий, когда я хочу уменьшить границу элемента управления Button, когда он получает фокус. Это связано с тем, что я не увеличил свойство границы этого элемента управления Button и в то же время не оставил бы кнопку того же размера (высота и ширина). Так что немного усилий в Интернете привело меня к тому, чтобы написать ValueConverter и уменьшить маржу. Но пока я пока не могу доработать рабочий код. Вот что я перемешалосьУменьшить маркер кнопки при фокусировке кнопки

Xaml

<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> 

Преобразователь:

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; 
} 

Приведенные выше результаты кода в StackOverflowException для Margin.Left вызывается рекурсивно. У кого-то есть лучшая идея или реализация для сценария, который я пытаюсь достичь.

+0

Что причина не пытается использовать "LostFocus" и события "GotFocus" в классе Button? Может быть проще, чем IValueConverter. –

+0

Лесли, спасибо за ответ, но не могли бы вы посоветовать мне, как мы могли бы использовать его в этом сценарии. Я не хочу использовать код за файлом после шаблона MVVM. – Jatin

+0

Да, это не будет соответствовать MVVM. Одна вещь после взгляда на ваш XAML, хотя - кажется, что значение для поля Setter для bdrButton не расположено внутри Setter? Или ваша копия/вставка пошла не так. –

ответ

0

Вам понадобится использовать толщину для маржи и 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

Пример:

<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

Свойство margin будет кодироваться по-разному для другой кнопки, поэтому я не могу это сделать. Даже если я использую привязку элементов, чтобы получить маржу для использования в части «От» анимации, я не могу жестко закодировать любое значение в части «В», поскольку это будет разница между значением «От» маржи и BorderThickness, которые я увеличил. Я считаю, что мы не можем использовать Maths для установки свойства «To». Спасибо за ответ. привет, Nirvan – Jatin

+0

Держись на мгновение, я думаю, что могу использовать часть «А». Скоро вы узнаете. – Jatin

+0

Это всего лишь пример того, как это сделать в 1 случае, вы должны уметь его строить. Вы можете определить несколько толчков как StaticResources и использовать их. Я обновлю свой пример. – Dylan

Смежные вопросы