0

画像とテキストを含むボタンが必要です。それを と呼びましょうMyButton。ボタンの色、画像の位置、テキストの位置、画像のサイズ、フォントサイズは、表示されるたびに変わりMyButtonません。ただし、画像ソースとテキストは毎回異なります。最後に、ボタンの不透明度を無効にすると 0.2 に設定し、有効にすると 1 に戻す必要があります。

これまでの私のアプローチ (より良い方法があれば修正してください) は、Buttonクラスを継承するコード ビハインドを含む XAML ファイルを作成することです。私の 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="{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 に答える