2012-06-03 4 views
0

Я хочу создать гибкую кнопку изображения в wpf.
первый, я создать библиотеку управления WPF пользовательских настроек в пространстве имен 'ImageButton', как показано ниже:стиль по умолчанию пользовательского контроля в wpf

namespace ImageButton 
{ 

    public class ImageButton : Button 
    { 

     static ImageButton() 
     { 
       DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton))); 
     } 


      #region DisplayMode 
      [System.ComponentModel.Category("ImageButton")] 

      public ImageDisplayMode DisplayMode 
      { 
       get { return (ImageDisplayMode)GetValue(DisplayModeProperty); } 
       set { SetValue(DisplayModeProperty, value); } 
      } 

      public static readonly DependencyProperty DisplayModeProperty = 
     DependencyProperty.Register("DisplayMode", typeof(ImageDisplayMode), typeof(ImageButton), new FrameworkPropertyMetadata(ImageDisplayMode.ImageAboveText), displaymodevalidate); 

      public static bool displaymodevalidate(object value) 
      { 
       return value is ImageDisplayMode; 
      } 


      #endregion 

     } 
} 

в пространстве имен "ImageButton" я определить перечисление с именем 'ImageDisplayMode', как показано ниже:

public enum ImageDisplayMode 
{ 
    ImageAboveText = 1, 
    TextAboveImage = 2, 
    ImageBeforeText = 3, 
    TextBeforeImage = 4 
} 

и файл Generic.xaml изменен, как показано ниже:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ImageButton"> 
    <Style x:Name="style1" TargetType="{x:Type local:ImageButton}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
        <Button Background="Transparent"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
            <RowDefinition/> 
            <RowDefinition/> 
          </Grid.RowDefinitions> 
          <Image Grid.ColumnSpan="2" Name="img1" Width="{TemplateBinding ImageWidth}" Stretch="{TemplateBinding ImageStretch}" Height="{TemplateBinding ImageHeight}" Source="{TemplateBinding Image}"/> 
          <TextBlock Grid.ColumnSpan="2" Grid.Row="1" Name="lbl1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Text="{TemplateBinding Text}"/> 

         </Grid> 
        </Button> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

результат выше код на рисунке ниже:

[Image]
Текста

я хочу: , когда я изменить значение свойства 'DisplayMode' из ImageButton, для каждого возможного значения, контроль изменений в формы ниже:

1 ---- ---------------------------------
[изображение]
Текст

2 ---- ---------------------------------
Текст
[Изображение]

3 -------------------------------------
[Изображение ] Текст

4 --------------------------------------
Текст [Изображение ]

я думаю, я должен определить триггер в сетке в кодах Generic.xaml, как показано ниже:

<Grid.Triggers> 
    <Trigger Property="DisplayMode" Value="2"> 
     <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
     <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
    </Trigger> 
</Grid.Triggers> 

пожалуйста, скажите мне:
Как ча Я это делаю?

Большое спасибо

ответ

0

благодаря fmunkert ...
я пошевелить триггеры ControlTemplate.Triggers и изменить TRIGGER.VALUE от «2» до «ImageAboveText» (один из моих пользовательских элементов перечислений), как показано ниже:

Перед Edit:

<Trigger Property="DisplayMode" Value="2"> 
    <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
    <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
</Trigger> 

После Edit:

<Trigger Property="DisplayMode" Value="ImageAboveText"> 
    <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
    <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
</Trigger> 

моя проблема решена успешно ....
спасибо.

1

Добавить спусковые к вашему стилю (т.е. <Style.Triggers>...</Style.Triggers>).

I.e. что-то вроде этого:

<Style.Triggers> 
    <Trigger Property="DisplayMode" Value="2"> 
     <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
     <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
    </Trigger> 
</Style.Triggers> 
+0

спасибо, я проверяю ваш ответ, но имеет ошибку: я перемещаю свои триггеры в controltemplate, и это ошибка решена, но не работает должным образом. –

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