WPF Button with Image

后端 未结 6 1704
长发绾君心
长发绾君心 2020-12-08 00:11

I\'m trying to attach an image on a button in WPF, however this code fails. Seems strange after similar code would work perfectly in Mozilla XUL.

相关标签:
6条回答
  • 2020-12-08 00:12

    You want to do something like this instead:

    <Button>
        <StackPanel>
            <Image Source="Pictures/apple.jpg" />
            <TextBlock>Disconnect from Server</TextBlock>
        </StackPanel>
    </Button>
    
    0 讨论(0)
  • 2020-12-08 00:12

    Most simple approach would be using the Image tag.

    <Button Name="btn" Width="26" Height="26" Click="btnClick"> 
       <Image Source="Resource/btn-icon.png"/>
    </Button>
    

    Suppose your image file is added in Resource folder

    0 讨论(0)
  • 2020-12-08 00:16

    This should do the job, no?

    <Button Content="Test">
        <Button.Background>
            <ImageBrush ImageSource="folder/file.PNG"/>
        </Button.Background>
    </Button>
    
    0 讨论(0)
  • 2020-12-08 00:26

    You can create a custom control that inherits from the Button class. This code will be more reusable, please look at the following blog post for more details: WPF - create custom button with image (ImageButton)

    Using this control:

    <local:ImageButton Width="200" Height="50" Content="Click Me!"
        ImageSource="ok.png" ImageLocation="Left" ImageWidth="20" ImageHeight="25" />
    

    ImageButton.cs file:

    public class ImageButton : Button
    {
       static ImageButton()
       {
           DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton)));
       }
    
       public ImageButton()
       {
           this.SetCurrentValue(ImageButton.ImageLocationProperty, WpfImageButton.ImageLocation.Left);
       }
    
       public int ImageWidth
       {
           get { return (int)GetValue(ImageWidthProperty); }
           set { SetValue(ImageWidthProperty, value); }
       }
    
       public static readonly DependencyProperty ImageWidthProperty =
           DependencyProperty.Register("ImageWidth", typeof(int), typeof(ImageButton), new PropertyMetadata(30));
    
       public int ImageHeight
       {
           get { return (int)GetValue(ImageHeightProperty); }
           set { SetValue(ImageHeightProperty, value); }
       }
    
       public static readonly DependencyProperty ImageHeightProperty =
           DependencyProperty.Register("ImageHeight", typeof(int), typeof(ImageButton), new PropertyMetadata(30));
    
       public ImageLocation? ImageLocation
       {
           get { return (ImageLocation)GetValue(ImageLocationProperty); }
           set { SetValue(ImageLocationProperty, value); }
       }
    
       public static readonly DependencyProperty ImageLocationProperty =
           DependencyProperty.Register("ImageLocation", typeof(ImageLocation?), typeof(ImageButton), new PropertyMetadata(null, PropertyChangedCallback));
    
       private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
       {
           var imageButton = (ImageButton)d;
           var newLocation = (ImageLocation?) e.NewValue ?? WpfImageButton.ImageLocation.Left;
    
           switch (newLocation)
           {
               case WpfImageButton.ImageLocation.Left:
                   imageButton.SetCurrentValue(ImageButton.RowIndexProperty, 1);
                   imageButton.SetCurrentValue(ImageButton.ColumnIndexProperty, 0);
                   break;
               case WpfImageButton.ImageLocation.Top:
                   imageButton.SetCurrentValue(ImageButton.RowIndexProperty, 0);
                   imageButton.SetCurrentValue(ImageButton.ColumnIndexProperty, 1);
                   break;
               case WpfImageButton.ImageLocation.Right:
                   imageButton.SetCurrentValue(ImageButton.RowIndexProperty, 1);
                   imageButton.SetCurrentValue(ImageButton.ColumnIndexProperty, 2);
                   break;
               case WpfImageButton.ImageLocation.Bottom:
                   imageButton.SetCurrentValue(ImageButton.RowIndexProperty, 2);
                   imageButton.SetCurrentValue(ImageButton.ColumnIndexProperty, 1);
                   break;
               case WpfImageButton.ImageLocation.Center:
                   imageButton.SetCurrentValue(ImageButton.RowIndexProperty, 1);
                   imageButton.SetCurrentValue(ImageButton.ColumnIndexProperty, 1);
                   break;
               default:
                   throw new ArgumentOutOfRangeException();
           }
       }
    
       public ImageSource ImageSource
       {
           get { return (ImageSource)GetValue(ImageSourceProperty); }
           set { SetValue(ImageSourceProperty, value); }
       }
    
       public static readonly DependencyProperty ImageSourceProperty =
           DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
    
       public int RowIndex
       {
           get { return (int)GetValue(RowIndexProperty); }
           set { SetValue(RowIndexProperty, value); }
       }
    
       public static readonly DependencyProperty RowIndexProperty =
           DependencyProperty.Register("RowIndex", typeof(int), typeof(ImageButton), new PropertyMetadata(0));
    
       public int ColumnIndex
       {
           get { return (int)GetValue(ColumnIndexProperty); }
           set { SetValue(ColumnIndexProperty, value); }
       }
    
       public static readonly DependencyProperty ColumnIndexProperty =
           DependencyProperty.Register("ColumnIndex", typeof(int), typeof(ImageButton), new PropertyMetadata(0));
    }
    
    public enum ImageLocation
    {
       Left,
       Top,
       Right,
       Bottom,
       Center
    }
    

    Generic.xaml file:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfImageButton">
        <Style TargetType="{x:Type local:ImageButton}" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Image Source="{Binding ImageSource, RelativeSource={RelativeSource AncestorType=local:ImageButton}}"
                                   Width="{Binding ImageWidth, RelativeSource={RelativeSource AncestorType=local:ImageButton}}"
                                   Height="{Binding ImageHeight, RelativeSource={RelativeSource AncestorType=local:ImageButton}}"
                                   Grid.Row="{Binding RowIndex, RelativeSource={RelativeSource AncestorType=local:ImageButton}}"
                                   Grid.Column="{Binding ColumnIndex, RelativeSource={RelativeSource AncestorType=local:ImageButton}}"
                                   VerticalAlignment="Center" HorizontalAlignment="Center"></Image>
                            <ContentPresenter Grid.Row="1" Grid.Column="1" Content="{TemplateBinding Content}"
                                              VerticalAlignment="Center" HorizontalAlignment="Center"></ContentPresenter>
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    
    0 讨论(0)
  • 2020-12-08 00:32

    Another way to Stretch image to full button. Can try the below code.

    <Grid.Resources>
      <ImageBrush x:Key="AddButtonImageBrush" ImageSource="/Demoapp;component/Resources/AddButton.png" Stretch="UniformToFill"/>
    </Grid.Resources>
    
    <Button Content="Load Inventory 1" Background="{StaticResource AddButtonImageBrush}"/> 
    

    Referred from Here

    Also it might helps other. I posted the same with MouseOver Option here.

    0 讨论(0)
  • 2020-12-08 00:37
    <Button x:Name="myBtn_DetailsTab_Save" FlowDirection="LeftToRight"  HorizontalAlignment="Left" Margin="835,544,0,0" VerticalAlignment="Top"  Width="143" Height="53" BorderBrush="#FF0F6287" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontFamily="B Titr" FontSize="15" FontWeight="Bold" BorderThickness="2" Click="myBtn_DetailsTab_Save_Click">
        <StackPanel HorizontalAlignment="Stretch" Background="#FF1FB3F5" Cursor="Hand" >
            <Image HorizontalAlignment="Left"  Source="image/bg/Save.png" Height="36" Width="124" />
            <TextBlock HorizontalAlignment="Center" Width="84" Height="22" VerticalAlignment="Top" Margin="0,-31,-58,0" Text="ثبت مشتری" />
        </StackPanel>
    </Button>
    
    0 讨论(0)
提交回复
热议问题