2017-01-17 2 views
0

Это в App.xaml мой Style:Статический ресурс для сеттер Value

 <Style x:Key="numButton" TargetType="{x:Type Button}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Image x:Name="img" Style="{DynamicResource imgDefault}"></Image> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsPressed" Value="true"> 
           <Setter Property="Source" TargetName="img" Value="img/1_push.png"></Setter> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Cursor" Value="Hand"></Setter> 
     </Style> 

     <Style x:Key="imgDefault" TargetType="{x:Type Image}"> 
      <Setter Property="Source" Value="img/0.png"></Setter> 
     </Style> 

У меня есть несколько кнопок в виде чисел (0-9), и я хочу использовать один стиль для всех из, чтобы избежать больше текста типирование. Так что теперь я хочу знать, можно ли изменить Value="img/1_push.png" в App.xaml для каждой кнопки, когда она нажата

   <Button Name="btn1" Grid.Row="0" Grid.Column="0" Style="{DynamicResource numButton}" Foreground="White"> 
        <Button.Resources> 
         <Style x:Key="imgDefault" TargetType="{x:Type Image}"> 
          <Setter Property="Source" Value="img/1.png"></Setter> 
         </Style> 
        </Button.Resources> 
       </Button> 

: В настоящее время я могу изменить фон по умолчанию каждой кнопки, как это? Например, когда нажата 2, я хочу, чтобы это был фон 2_push.png.

Заранее спасибо.

+0

см. [Это] (http://stackoverflow.com/a/12271980/692829) ответ, вам нужно только заменить 'IsMouseOver' на' IsPressed' – lena

ответ

1

Вы можете создать пользовательский класс Button с двумя свойствами зависимостей:

ImageButton.cs:

namespace WpfApplication2 
{ 
    public class ImageButton : System.Windows.Controls.Button 
    { 
     public static readonly DependencyProperty DefaultImageProperty = 
      DependencyProperty.Register("DefaultImage", typeof(Uri), typeof(ImageButton)); 

     public Uri DefaultImage 
     { 
      get { return (Uri)GetValue(DefaultImageProperty); } 
      set { SetValue(DefaultImageProperty, value); } 
     } 

     public static readonly DependencyProperty PressedImageProperty = 
      DependencyProperty.Register("PressedImage", typeof(Uri), typeof(ImageButton)); 

     public Uri PressedImage 
     { 
      get { return (Uri)GetValue(PressedImageProperty); } 
      set { SetValue(PressedImageProperty, value); } 
     } 
    } 
} 

app.xaml:

<Application x:Class="WpfApplication2.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication2" 
     StartupUri="Window1.xaml"> 
<Application.Resources> 
    <Style TargetType="local:ImageButton"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
        <Image x:Name="img" Source="{Binding DefaultImage,RelativeSource={RelativeSource TemplatedParent}, FallbackValue=img/0.png, TargetNullValue=img/0.png}" /> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsPressed" Value="true"> 
          <Setter Property="Source" TargetName="img" Value="{Binding PressedImage, RelativeSource={RelativeSource TemplatedParent}, FallbackValue=img/1_push.png, TargetNullValue=img/1_push.png}"></Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Cursor" Value="Hand"></Setter> 
    </Style> 
</Application.Resources> 

Использование:

<local:ImageButton x:Name="btn1" Grid.Row="0" Grid.Column="0" Foreground="White" 
         DefaultImage="img/1.png" PressedImage="2_push.png"/> 

Это намного более чистый и гибкий подход.

+0

Вы также можете использовать связанные свойства зависимостей, вы не обязательно нужен пользовательский класс 'Button'. –

+0

В отличие от свойств, связанных с контролем, нет шаблона управления по умолчанию или неявного стиля. – mm8

+0

@ mm8 в моем MainWindow.xaml он говорит 'Префикс пространства имен" local "не определен'. Мне нужно создать 'public class ImageButton' внутри моего MainWindow.cs? –

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