0

カスタム画像ボタンを作成し、スタイルを追加します。すべてが正常に動作します。しかし、他のボタンで再利用しようとすると、うまく機能しませんでした。スタイルに従うボタンは1つだけで、他のボタンは常に空白です。

実行時にエラーは発生しませんでした。助けてください!!

どうも

コードは次のとおりです。

ボタン:

    public class ImageTextButton : Button
{
    public DependencyProperty TextProperty { get; set; }
    public DependencyProperty ImageProperty { get; set; }

    public ImageTextButton()
    {
        TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ImageTextButton), null);
        ImageProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageTextButton), null);
    }

    public ImageSource ImageSource
    {
        get { return (ImageSource)GetValue(ImageProperty); }
        set { SetValue(ImageProperty, value); }
    }

    public string Text { get; set; }
}

xaml:

<Controls:ImageTextButton HorizontalAlignment="Left" Command="{Binding SendCustomerChanges}" Style="{StaticResource ImageTextButton}" IsEnabled="{Binding Path=DetailsInformation.IsAllowSave}"
                             Text="{Binding Path=CustomerResources.Button_CloseDetailedView, Source={StaticResource ResourceWrapper}}" ImageSource="{Binding Path=SaveIcon, Source={StaticResource ApplicationIcons}}" />

スタイル:

    <Style TargetType="Controls:ImageTextButton" x:Key="ImageTextButton" >
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Controls:ImageTextButton">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommomStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ColorAnimation Duration="0" To="LightGray" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled" >
                                <Storyboard>
                                    <DoubleAnimation Duration="0" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity" To="1"/>
                                    <ColorAnimation Duration="0" To="#AAAAAA" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="textBlock" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Rectangle x:Name="rectangle" Fill="#E0E9F1"  StrokeThickness="1" Stroke="#728DA3"/>
                    <Rectangle x:Name="DisabledVisualElement" Fill="#F5F5F5" IsHitTestVisible="false" StrokeThickness="1" Stroke="#D3D3D3" Opacity="0" />
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Width="12" Height="12" Margin="2,0,2,0" Source="{TemplateBinding ImageSource}">
                        </Image>
                        <TextBlock Grid.Column="1" x:Name="textBlock" Margin="2,3,4,0" Text="{TemplateBinding Text}" />
                    </Grid>
                    <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5,3,5,3"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
4

1 に答える 1

3

変更/修正する必要があることがいくつかあります。

  1. Text Depenency プロパティの形式が正しくありません。DP のゲッターとセッターを定義する必要があります (ImageSourceProperty で行ったように)。

  2. ImageSource 依存関係プロパティにも注意が必要です... DP には ImageSourceProperty という名前を付ける必要があります ...Dependency Properties must follow the pattern ここで説明します if they are to work under all conditions. Especially so when you are setting them from XAML

  3. default style keyスタイルが実際に適用されるように、新しいクラスにが必要です

  4. 依存関係プロパティは、静的コンストラクターに (またはフィールド初期化子として) 登録する必要があります。インスタンス コンストラクターには登録しません。

    public class ImageTextButton : Button
    {
        public ImageTextButton()
        {
            DefaultStyleKey = typeof(ImageTextButton);
        }
    
        static ImageTextButton()
        {
            TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ImageTextButton), new PropertyMetadata(null));
            ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageTextButton), new PropertyMetadata(null));
        }
    
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty;
    
    
    
        public ImageSource ImageSource
        {
            get { return (ImageSource)GetValue(ImageSourceProperty); }
            set { SetValue(ImageSourceProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for ImageSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ImageSourceProperty;
    
    
    }
    
于 2013-03-05T07:32:14.647 に答える