0

我需要一个带有图像和一些文本的按钮,让我们称之为MyButton。每次MyButton显示时,按钮颜色、图像位置、文本位置、图像大小和字体大小保持不变。但是,图像源和文本每次都会有所不同。最后,按钮的不透明度需要在禁用时设置为 0.2,在启用时设置回 1。

到目前为止,我的方法(如果有更好的方法,请纠正我)是创建一个 XAML 文件,其中包含继承Button该类的代码。我的 XAML 类似于:

<Button x:Class="MyButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

    <!--Blank template for a flat borderless button-->
    <Button.Template>
        <ControlTemplate TargetType="Button"/>
    </Button.Template>

    <Grid Background="#F2F2F2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Image Name="ImgControl" Width="32" Height="32" Grid.Column="0"/>

        <TextBlock Name="Label" VerticalAlignment="Center" Grid.Column="1"/>

    </Grid>
</Button>

和后面的代码:

Partial Public Class MyButton
Inherits Button

Private _imgSrc As String
Public Property ImageSource As String
    Get
        Return _imgSrc
    End Get
    Set(value As String)
        _imgSrc = value
        Dim imgUri As New Uri(_imgSrc, UriKind.RelativeOrAbsolute)
        ImgControl.Source = New BitmapImage(imgUri)
    End Set
End Property

Public Property ButtonText As String
    Get
        Return Label.Text
    End Get
    Set(value As String)
        Label.Text = value
    End Set
End Property
End Class

所以每当我在 XAML 中使用它时,我只需要声明按钮、ImageSource 和 ButtonText 属性。

到目前为止这工作正常,但我在启用/禁用按钮时设置不透明度时遇到问题。我试过转换器,但运气不佳。有什么建议么?

谢谢

4

2 回答 2

0

在您的 MyButton 类中创建一个依赖项:

public double myOpacity
    {
        get { return (double)GetValue(myOpacityProperty); }
        set { SetValue(myOpacityProperty, value); }
    }

    public static readonly DependencyProperty myOpacityProperty =
        DependencyProperty.Register("myOpacity", typeof(double), typeof(MyButton), new PropertyMetadata(0.2));

在你的 XAML 设置 Opacity 像这样

Opacity="{Binding BindsDirectlyToSource=True, Path= myOpacity}"

然后在你的代码后面改变你设置它的不透明度 mybutton.myOpacity=1;

于 2013-03-01T15:13:03.197 回答
0

或者像这个例子一样使用Visual State Manager :

<Button Width="150" IsEnabled="True" Height="100">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Grid Background="#F2F2F2" x:Name="BtnBg">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="Common">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="BtnBg" Storyboard.TargetProperty="Opacity">
                                        <SplineDoubleKeyFrame KeyTime="0" Value=".2"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <Image Name="ImgControl" Width="32" Height="32" Grid.Column="0"/>

                    <TextBlock Name="Label" VerticalAlignment="Center" Grid.Column="1"/>

                </Grid>
            </ControlTemplate>
        </Button.Template>
    </Button>

更改字段“IsEnabled”,您将看到更改。

于 2013-03-01T18:03:27.800 回答