wpf 自定义控件的使用

来源:互联网 发布:软件测试工作怎么样 编辑:程序博客网 时间:2024/05/13 15:42
wpf程序中使用自定义控件
 
新建用户控件
 
写一个带有图片的button 
 
 
这是两个自定义按钮 添加可以点击  修改不可以点击 来自同一个自定义控件
 
<UserControl x:Class="WpfSop.Lib.Controls.IconButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WpfSop.Lib.Controls"
             mc:Ignorable="d"
             x:Name="iconButton"
             d:DesignHeight="100" d:DesignWidth="400">
    <Grid>
        <Image x:Name="imageEnable" Grid.ColumnSpan="2" Source="../Images/btn_enable.png" Stretch="Fill"/>
        <Image x:Name="imageDisable" Grid.ColumnSpan="2" Source="../Images/btn_disable.png" Stretch="Fill" Visibility="Collapsed"/>
        <Button IsEnabled="{Binding Path=IsEnabled,ElementName=iconButton}" Click="Button_Click">
            <Button.Template>
                <ControlTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{Binding Path=ActualHeight,ElementName=iconButton}"/>
                            <ColumnDefinition Width="1*"/>
                        </Grid.ColumnDefinitions>
                        <Image Margin="8" Source="{Binding Path=Icon,ElementName=iconButton}"/>
                        <TextBlock Grid.Column="1" Margin="-16,0,0,0" VerticalAlignment="Center"  HorizontalAlignment="Center"
                            FontSize="{Binding Path=FontSize,ElementName=iconButton}" Foreground="{Binding Path=Foreground,ElementName=iconButton}" Text="{Binding Path=Text,ElementName=iconButton}"/>
                    </Grid>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </Grid>
</UserControl>
 
 
设置背景图片 可以拉伸Stretch="Fill"
grid里面自定义button样式
给这个button绑定样式 用binding
比如里面有个textblock 的text    
Text="{Binding Path=Text,ElementName=iconButton}"
path绑定后台自定义属性
ElementName绑定这个UserControl的x:name
 
cs文件
public string Text
        {
            get { return (string)GetValue(TextTextProperty); }
            set
            {
                SetValue(TextTextProperty, value);
               // IconButton_SizeChanged(10);//一个方法自动调整文本字体大小
            }
        }
        public static readonly DependencyProperty TextTextProperty =
         DependencyProperty.Register("Text", typeof(string), typeof(IconButton));
 
 
 
 
 
自动调整文字大小的方法
/// <summary>
        /// 自动调整字字体大小比例
        /// </summary>
        public double AutoFontSizeRate
        {
            get { return (double)GetValue(AutoFontSizeRateProperty); }
            set { SetValue(AutoFontSizeRateProperty, value); }
        }
        public static readonly DependencyProperty AutoFontSizeRateProperty =
          DependencyProperty.Register("AutoFontSizeRate", typeof(double), typeof(IconButton), new PropertyMetadata(0.4));
第一个十这个属性名字   第二项为属性   第三项为所属的类  第四项为默认选项
 
 
下面这个是设置图片的属性 默认选项可以为空 暂时还不知道怎么填默认选项
/// <summary>
        /// 按钮图标
        /// </summary>
        public ImageSource Icon
        {
            get { return (ImageSource)GetValue(IconProperty); }
            set
            {
                if (null == value) value = new BitmapImage(new Uri("/WpfSop.Lib;component/Images/btn_disable.png", UriKind.RelativeOrAbsolute));
                SetValue(IconProperty, value);
            }
        }
        public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(IconButton), null);
 
 
 
 
private async void IconButton_SizeChanged(int delay = 0)
        {
            try
            {
                if (AutoFontSize)
                {
                    if (delay > 0)
                    {
                        await Task.Delay(delay);
                    }
                }
 
                double FontSize = 0;
                FontSize = ActualHeight * AutoFontSizeRate;
                // 文本宽高比大于外框宽高比
                if (iconButton.ActualWidth * ActualHeight > ActualWidth * iconButton.ActualHeight)
                {
                    FontSize = AutoFontSizeRate * ActualWidth * iconButton.ActualHeight / iconButton.ActualWidth;
                }
                if (FontSize > 0)
                {
                    iconButton.FontSize = FontSize;
                }
            }
            catch { }
        }
 
async 异步的
 
int delay=0  默认等于0  调用方法的时候在填个int类型的数字
await Task.Delay(delay);让程序等待几秒钟再执行
 
自定义button传递点击事件
自定义一个公共变量 public event EventHandler<RoutedEventArgs> Click = null;
在button的点击事件里 Click?.Invoke(sender, e);
原创粉丝点击